gpt4 book ai didi

c# - 尝试按动态属性对 IQueryable 进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:30 24 4
gpt4 key购买 nike

我有以下问题,我想用一个 Linq 查询来解决:

我的数据存储在一个数据库中,我借助 Entity Framework 的 Linq to SQL 检索这些数据,然后我想应用排序。为此,我有一个从客户端获取的简单字符串,然后动态映射到一个属性。之后,我仅通过简单的 Skip and Take 获取需要显示的 block 。

现在的问题似乎是我尝试应用的操作并没有很好地结合在一起。我使用 IQueryable 作为 Linq 结果,因为我从数据库中获取数据。一旦 Linq 查询尝试执行,我就会收到错误消息,即使用 Linq to SQL 我无法使用“ToValue()”,我需要像这样进行动态排序:

x.GetType().GetProperty(propertyName).GetValue(x, null);

我正在尝试做的事情是否可行,有人可以为我指明正确的方向吗?我一直在尝试各种不同的方法,但都无济于事。

这是我对一些变量进行硬编码的最后一种方法,但它也不起作用(而且它可能很笨拙,因为我已经研究它一段时间了)。

IQueryable<OA_FileUpload> result;
Expression<Func<MyObject, object>> orderBy = x => x.GetType().GetProperty(propertyName).GetValue(x, null);
result = Db.MyObject.Where(f => f.isSomething == true && f.isSomethingElse == false)
.OrderBy(orderBy)
.Skip(20)
.Take(20);

一旦我稍后尝试对结果做某事,它就会完全失败。

最佳答案

不,按照您尝试的方式是不可能的。 Entity Framework 的引擎无法将 x.GetType().GetProperty(propertyName).GetValue(x, null); 转换为 SQL。您在 SkipTake 之前应用 OrderBy,这是正确的方法,但这也意味着您的排序将被翻译为生成的 SQL。

不过,您可以做的是巧妙地构建您的查询(即分几步)。然后您可以添加具有所需条件的排序。像这样:

IQueryable<OA_FileUpload> result = 
Db.MyObject.Where(f => f.isSomething == true && f.isSomethingElse == false);

//Add your conditional sorting.
if(...) //Your first condition for sorting.
result = result.OrderBy(....); //Your sorting for that condition.
else if(...) //Your second condition for sorting.
result = result.OrderBy(....); //Your sorting for that condition.

//Now apply the paging.
result = result.Skip(20).Take(20);

上面的 LINQ 仍然被转换为单个查询并作为一个查询执行,但现在您可以添加所有您想要的条件。

关于c# - 尝试按动态属性对 IQueryable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22937375/

24 4 0