我有一个问题,我想用一个Linq查询来解决:
我将数据放在数据库中,我在Entity Framework的Linq to SQL的帮助下检索,然后我想应用排序。为此,我有一个从客户端获取的简单字符串,然后我动态映射到属性。之后我只通过一个简单的Skip and Take获得我需要显示的块。
现在的问题似乎是我尝试应用的行动并不能很好地结合在一起。我使用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);
一旦我稍后尝试对结果做某事,它就会彻底失败。
答案 0 :(得分:1)
不,你尝试的方式是不可能的。实体框架的引擎无法将x.GetType().GetProperty(propertyName).GetValue(x, null);
转换为SQL。您在OrderBy
和Skip
之前应用Take
,这是正确的方式,但这也意味着您的排序将被转换为生成的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仍然被翻译成单个查询并执行,但现在您可以添加所需的所有条件。