我有一个小问题,我会尽量详细解释。
在我的系统上,我有一个使用 EF 4.1 的通用存储库。 一切都很好,但是在某些情况下我遇到了一个问题,我需要对一些查询执行动态 orderBy。
我通过参数收到一个“字符串”,它代表我类(class)中的字段,以执行 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'
如果属性是字符串类型,异常(exception)是 “System.String”类型的表达式不能用于返回类型“System.Object”
换句话说,代码不适用于“对象”类型。
任何人都知道我该如何解决这个问题?
感谢您的宝贵时间。
最佳答案
以下是我如何使用 EF4 和我在标准开发库中创建的一些通用方法进行动态排序和分页。重要的是您用于为 SortBy 方法创建 Lambda 表达式的第二段代码。
public enum SqlOrderByDirecton
{
ASC,
DESC
}
//Derive Lambda Expression from string
string sortByKey = "BusinessId";
string value = "DESC";
var p = Expression.Parameter(typeof(T));
this.SortBy = Expression.Lambda<Func<T, dynamic>>(Expression.TypeAs(Expression.Property(p, sortByKey), typeof(object)), p).Compile();
this.SortOrder = (DevCore.SqlOrderByDirecton)Enum.Parse(typeof(DevCore.SqlOrderByDirecton), value, true);
public static List<T> SortAndPaginate<T>(IEnumerable<T> query,
Func<T, object> sortBy,
SqlOrderByDirecton sortOrder,
int rowLimit,
int startRecord,
out int recordCount)
{
recordCount = query.Count();
List<T> list = new List<T>();
if (sortOrder == SqlOrderByDirecton.ASC)
{
list = query.OrderBy(sortBy).Skip(startRecord).Take(rowLimit).ToList();
}
else
{
list = query.OrderByDescending(sortBy).Skip(startRecord).Take(rowLimit).ToList();
}
return list;
}
关于asp.net-mvc - LINQ - OrderBy 的动态表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10423482/