【发布时间】:2012-05-03 00:14:19
【问题描述】:
我有一个小问题,我会尽量详细解释。
在我的系统上,我有一个使用 EF 4.1 的通用存储库。 一切都很好,但是在某些情况下我遇到了一个问题,我需要对一些查询进行动态 orderBy。
我通过参数收到一个“字符串”,它代表我的班级中的字段,以执行 orderBy(如“id”或“description”)
部分代码:
public class SomeClass
{
public int id { get; set; }
public string description { get; set; }
}
// First we define the parameter that we are going to use
// in our OrderBy clause. This is the same as "(parameter =>"
// in the example above.
var param = Expression.Parameter(typeof(SomeClass), "parameter");
// Now we'll make our lambda function that returns the
// request.SortingName property by it's name.
var expression = Expression.Lambda<Func<SomeClass, int>>(Expression.Property(param, request.SortingName), param);
好吧,如果 "request.SortingName" 类型为 "int" (id) ,则此代码有效,但如果我想通过 "string" (description) 或其他类型进行 orderBy,则此代码不起作用。
我将表达式改为使用“对象”:
var expression = Expression.Lambda<Func<SomeClass, object>>(Expression.Property(param, request.SortingName), param);
但是当我运行代码时,编译器会抛出下一个异常: 'System.Int32' 类型的表达式不能用于返回类型 'System.Object'
如果属性是字符串类型,例外是 “System.String”类型的表达式不能用于返回类型“System.Object”
换句话说,代码不适用于“对象”类型。
任何人都知道我该如何解决这个问题?
感谢您的宝贵时间。
【问题讨论】:
-
您不能对目标类型使用反射并根据您的名称查找属性并从中确定正确的类型吗?
-
Dynamic LINQ OrderBy 可能会有所帮助
标签: asp.net-mvc linq entity-framework