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
我正在使用 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