实体框架:将分页与Dynamic LINQ OrderBy相结合

时间:2017-09-11 10:59:56

标签: c# entity-framework linq dynamic-linq

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

@SpringBootApplication(basePackages = {"com.test.myhazelcast"})

我有这些私人助手方法:

var items = GetItems(storeNumber);

Sort(items);

Page(items);

return await items.ToListAsync();

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

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

在我的Page方法中,我得到了异常

  

方法&#39; OrderBy&#39;必须在方法之前调用&#39;跳过&#39;

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

我怀疑错误的原因是因为项目需要private void Page(IQueryable<Item> items, int skip, int take) { items = items.Skip(skip).Take(take); } 但是动态LINQ OrderBy没有重载 IOrderedQueryable<Item>。 如果我将Sort和Page代码提取到相同的方法中,使用IOrderedQueryable<T>它不再是问题,它会推断出类型。问题似乎是在排序和分页时使用var接口。有没有办法可以将这个逻辑分解为单独的方法,但仍然使用Dynamic LINQ进行排序?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您应该从Sort()和Page()方法返回新构造的IQueryable,就像对GetItems()一样。 如果你在这样的方法中“重写”一个参数值,它对最初传入参数的值没有影响,因为C#使用by-value参数传递语义

有关详细参考,请参阅此处: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters