我有一张桌子即 StudentInfo
表:DbSet<StudentInfo>
ID Name
_____________________
1 Ram
2 Kumar
我的C#代码是
using(var db = new Entities()) {
Expression<Func<StudentInfo,object>> sortColumn = i => i.ID;
IQueryable<StudentInfo> qryStudent = db.StudentInfos.Where(i => true)
.OrderBy(sortColumn);
}
抛出异常
&#34;无法转换类型&System; Int.322&#39;键入&#39; System.Object&#39;。 LINQ to Entities仅支持转换EDM原语或枚举类型。&#34;
如果我在Expression中修改像i => i.ID.ToString()
这样的代码,那么它的工作
using(var db = new Entities()) {
Expression<Func<StudentInfo,object>> sortColumn = i => i.ID.ToString();
IQueryable<StudentInfo> qryStudent = db.StudentInfos.Where(i => true)
.OrderBy(sortColumn);
}
如何以正确的方式解决这个问题。
我需要一个通用的解决方案,Expression应该像这样Expression<Func<StudentInfo,dynamic>>
。它应该匹配
switch(sortKey) {
case "ID"
sortColumn = i => i.ID;
break;
case "Name"
sortColumn = i => i.Name;
break;
}
请帮助我...
答案 0 :(得分:1)
有一些要点需要考虑:
Where(i => true)
只需要所有元素,这不是必需的Expression<Func<StudentInfo, int>> sortColumn = i => i.ID;
请尝试描述您的完整问题。所以它更容易回答,你可能会更快地得到帮助:))
答案 1 :(得分:0)
尝试替换以下代码:
Expression<Func<StudentInfo, object>> sortColumn = i => Convert.ToInt32(i.ID);
问题在于将对象类型的数据转换为整数类型。
答案 2 :(得分:0)
你可以扩展IQueryable以添加一个自定义OrderBy,它接受像这样的排序键
public static IQueryable OrderBy(this IQueryable<StudentInfo> queryable, string sortKey)
{
switch (sortKey)
{
case "ID":
return queryable.OrderBy(i => i.ID);
case "Name":
return queryable.OrderBy(i => i.Name);
}
return queryable;
}
有了这个,您可以使用像这样的排序键来执行订单
var students = db.StudentInfos.OrderBy(sortColumn, "ID");
答案 3 :(得分:0)
您可以在github https://github.com/PoweredSoft/DynamicLinq
中使用此功能或Nuget https://www.nuget.org/packages/PoweredSoft.DynamicLinq/
简单排序
query = query.OrderByDescending("AuthorId");
query = query.ThenBy("Id");