C# 尝试按动态属性对IQueryable进行排序
我想用一个Linq查询解决以下问题: 我将数据保存在一个数据库中,通过Entity Framework的Linq to SQL进行检索,然后我想应用排序。为此,我从客户端获得了一个简单的字符串,然后动态映射到属性。在那之后,我只通过一个简单的跳转获取需要显示的块 现在的问题似乎是,我尝试采取的行动并不真正配合得很好。我对Linq结果使用IQueryable,因为我从数据库中获取数据。当Linq查询尝试执行时,我得到一个错误,即对于Linq to SQL,我不能使用“ToValue()”,我需要这样做动态排序:C# 尝试按动态属性对IQueryable进行排序,c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,我想用一个Linq查询解决以下问题: 我将数据保存在一个数据库中,通过Entity Framework的Linq to SQL进行检索,然后我想应用排序。为此,我从客户端获得了一个简单的字符串,然后动态映射到属性。在那之后,我只通过一个简单的跳转获取需要显示的块 现在的问题似乎是,我尝试采取的行动并不真正配合得很好。我对Linq结果使用IQueryable,因为我从数据库中获取数据。当Linq查询尝试执行时,我得到一个错误,即对于Linq to SQL,我不能使用“ToValue()”,我需要这
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);
x.GetType().GetProperty(propertyName).GetValue(x,null)代码>
我想做的事情可能吗?有人能给我指出正确的方向吗?我一直在玩弄各种不同的方法,但都没有用
这是我最后一个硬编码变量的方法,但它也不起作用(而且可能很笨重,因为我已经做了一段时间了)
IQueryable结果;
表达式orderBy=x=>x.GetType().GetProperty(propertyName).GetValue(x,null);
result=Db.MyObject.Where(f=>f.isSomething==true&&f.isSomethingElse==false)
.OrderBy(OrderBy)
.Skip(20)
.采取(20);
以后我一尝试做某件事,结果它就完全失败了。不,你尝试的方式是不可能的。实体框架的引擎无法转换x.GetType().GetProperty(propertyName).GetValue(x,null)代码>到SQL。在Skip
和Take
之前应用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);
IQueryable结果=
其中(f=>f.isSomething==true和&f.isSomethingElse==false);
//添加条件排序。
if(…)//排序的第一个条件。
result=result.OrderBy(..)//你对那种情况的分类。
else if(…)//排序的第二个条件。
result=result.OrderBy(..)//你对那种情况的分类。
//现在应用分页。
结果=结果。跳过(20)。取(20);
上面的LINQ仍然被转换为一个查询并作为一个查询执行,但现在您可以添加所有需要的条件。看看这个:我会看看这个,但请注意,我并没有尝试使用类似SQL的排序。在这一点上,我已经想对返回的对象的属性应用排序。好的,只要你不枚举(你说你得到了可查询的),你的顺序将“在SQL级别”应用。。。如果您已经枚举了,您的orderBy应该是Func
,而不是表达式
,我想这是我们已经在做的。问题是,我们有很多条件,都在一个大的交换案例中,我们正在寻找一种方法,通过动态地获取它们(即将propertyName映射到一个实际的属性),使代码更流畅。@AnneSchuessler我通常做的是,使它更整洁,更可重用:我放置条件,排序,例如:ApplyCriteria()
,ApplySorting()
,ApplyPaging()
,等等。这样,您甚至可以调用同一个函数向具有类似条件和/或排序的不同查询添加条件或排序。