Entity Framework Core 2.2 Скомпилированный параметр структуры запроса, оцениваемый локально

Арабские цифры, такие как 1,2,3,4 в юникоде, кодируются как символы в диапазоне от 1632 до 1641. Вычтите unicode для арабского нуля (1632) из ​​значения unicode каждой арабской цифры чтобы получить свои цифровые значения. Умножьте каждое цифровое значение на его значение места и суммируйте результаты, чтобы получить целое число.

Альтернативно используйте Regex.Replace для преобразования строки с арабскими цифрами в строку с десятичными цифрами, затем используйте Int.Parse для преобразования результат в целое число.

0
задан Adam 27 February 2019 в 16:09
поделиться

2 ответа

Я отправил отчет об ошибке в команду EF по адресу https://github.com/aspnet/EntityFrameworkCore/issues/14857 Он был закрыт и помечен как дубликат https: // github. com / aspnet / EntityFrameworkCore / Issues / 13976

Был перемещен в отставание. Вот ответ: «Основываясь на обычной сортировке, это функция, для которой есть разумный обходной путь, и для которой мы пока еще не видели значительного спроса, поэтому мы пока перенесем его в отставание». [113 ]

0
ответ дан Adam 27 February 2019 в 16:09
поделиться

Я считаю, что это связано с тем, как выражение хранится и оценивается. Это определенно ошибка, но я не уверен, что это будет исправлено в будущем.

Я настроил разбиение на страницы в своем проекте с помощью универсального класса, который в конечном итоге создает выражение из типов значений. (Обратите внимание, что есть неиспользуемые свойства и поля, так как я оставил некоторый специфичный для домена код из логики)

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();
0
ответ дан Kieran Devlin 27 February 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: