Entity Framework:将分页与 Dynamic LINQ OrderBy 相结合

Entity Framework: combining paging with Dynamic LINQ OrderBy

我正在使用 Entity Framework 检索一些数据,如下所示:

var items = GetItems(storeNumber);

Sort(items);

Page(items);

return await items.ToListAsync();

我有这些私有辅助方法:

private IQueryable<Item> GetItems(string storeNumber)
{
    return _dbContext.Items.Where(x => x.StoreNumber == storeNumber);
}

我使用 Dynamic LINQ 对结果进行排序。

private void Sort(IQueryable<Item> items, string fieldToSort, string sortDirection)
{
    items = items.OrderBy($"{fieldToSort} {sortDirection}");
}

在我的 Page 方法中出现异常

The method 'OrderBy' must be called before the method 'Skip'

private void Page(IQueryable<Item> items, int skip, int take)
{
    items = items.Skip(skip).Take(take);
}

我怀疑错误的原因是因为项目需要 IOrderedQueryable<Item> 但是 动态 LINQ OrderBy 没有重载 returns IOrderedQueryable<T>。 如果我将 Sort 和 Page 代码提取到相同的方法中,使用 var 它不再是问题,它会推断类型。问题似乎是在排序和分页时使用 IQueryable 接口。有没有一种方法可以将此逻辑分解为单独的方法,但仍使用 Dynamic LINQ 进行排序?

非常感谢任何帮助。

您应该 return 从 Sort() 和 Page() 方法新建 IQueryable,就像您对 GetItems() 所做的那样。 如果你 "rewrite" 一个像这样的方法中的参数值,它对最初传递给参数的值没有影响,因为 C# 使用按值参数传递语义

查看此内容以获取更多参考: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters