我正在尝试动态订购产品列表。
Product:
price (int)
name (string)
到目前为止,我已成功获得以下内容:
string columnToOrderBy = "price";
ParameterExpression param = Expression.Parameter(typeof(Product), "p");
var ordering = Expression.Lambda<Func<Product, double>>(Expression.Property(param, columnToOrderBy), param);
这适用于按价格排序,但由于列类型,按名称排序时无效。
Expression.Lambda<Func<Product, double>>
无论如何都要获取列的类型以在Func方法中设置它吗?
答案 0 :(得分:5)
看看动态LINQ,Scott Gu在这里发表了一篇很棒的帖子http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
它让它变得如此简单
query = query.OrderBy(columnName);
或
//orderby descending
query = query.OrderBy(columnName + " DESC");
当你不必要时,不需要手动操作表达树。使用动态LINQ将使您的代码更易于理解和维护。
您现在可以将其安装为Nuget包,但它们似乎都不是来自官方来源(在撰写本文时)。
这里有一个vanilla package,其中包含Scott Gu所提供的代码。
此处的branch of Scott's code已扩展为包含更多功能。它似乎正在积极发展,看起来很有趣。
答案 1 :(得分:0)
PM&GT; Install-Package System.Linq.Dynamic
query = query.OrderBy(columnName);