Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试按动态属性对IQueryable进行排序_C#_Sql_Linq_Entity Framework - Fatal编程技术网

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

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()”,我需要这

我想用一个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()
,等等。这样,您甚至可以调用同一个函数向具有类似条件和/或排序的不同查询添加条件或排序。