Арабские цифры, такие как 1,2,3,4 в юникоде, кодируются как символы в диапазоне от 1632 до 1641. Вычтите unicode для арабского нуля (1632) из значения unicode каждой арабской цифры чтобы получить свои цифровые значения. Умножьте каждое цифровое значение на его значение места и суммируйте результаты, чтобы получить целое число.
Альтернативно используйте Regex.Replace
для преобразования строки с арабскими цифрами в строку с десятичными цифрами, затем используйте Int.Parse
для преобразования результат в целое число.
Я отправил отчет об ошибке в команду EF по адресу https://github.com/aspnet/EntityFrameworkCore/issues/14857 Он был закрыт и помечен как дубликат https: // github. com / aspnet / EntityFrameworkCore / Issues / 13976
Был перемещен в отставание. Вот ответ: «Основываясь на обычной сортировке, это функция, для которой есть разумный обходной путь, и для которой мы пока еще не видели значительного спроса, поэтому мы пока перенесем его в отставание». [113 ]
Я считаю, что это связано с тем, как выражение хранится и оценивается. Это определенно ошибка, но я не уверен, что это будет исправлено в будущем.
Я настроил разбиение на страницы в своем проекте с помощью универсального класса, который в конечном итоге создает выражение из типов значений. (Обратите внимание, что есть неиспользуемые свойства и поля, так как я оставил некоторый специфичный для домена код из логики)
public class Pagination<T>
{
public IQueryable<T> Items;
public int CurrentPageNumber { get; }
public int PageSize { get; }
public int StartPage { get; }
public int TotalPages { get; set; }
public Pagination(IQueryable<T> items, int pageNumber, int pageSize)
{
if (pageNumber <= 0)
{
throw new ArgumentOutOfRangeException(nameof(pageNumber));
}
if (pageSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(pageSize));
}
if (((decimal)DisplayPages % 2) == 0)
{
throw new ArgumentOutOfRangeException(nameof(DisplayPages), "Number of pages to render must be odd.");
}
Items = items;
CurrentPageNumber = pageNumber;
PageSize = pageSize;
StartPage = 1;
if (items.Any())
{
var rowCount = items.Count();
TotalPages = (int)Math.Ceiling((decimal)rowCount / PageSize);
}
else
{
TotalPages = 1;
}
}
public IQueryable<T> GetPageData()
{
return Items.Skip((CurrentPageNumber - 1) * PageSize).Take(PageSize) ?? new List<T>().AsQueryable();
}
}
Тогда вы можете использовать его следующим образом:
var paginatedObjects = new Pagination<Type>(query, 1, 10)
{
//Options if nessasary
};
paginatedObjects.GetPageData();