创建LINQ /的Lamda的排序依据表达 [英] Create an OrderBy Expression for LINQ/Lamda
问题描述
我要创建一个概念证明使用Labmda / LINQ动态地点和排序依据。下面的代码工作为那里的表情,但我无法弄清楚如何创建通过表达式订单。对于这个exmample,如果可能的话,我想保持简单;我宁愿不写修改表达式树的代码。
无效的主要()
{
的DateTime productSince = DateTime.UtcNow.Subtract(新的TimeSpan(1 ,30,0));
表达式来; Func键<产品,布尔>>过滤器= D => d.CreatedDate> productSince&功放;&安培; d.Price< 100;
名单,LT;产品>产品=的GetProducts(过滤器,产品);
Console.WriteLine(产品);
}
私人静态列表<产品>的GetProducts(表达式来; Func键<产品,布尔>>过滤器,表<产品>产品)
{
变种产品= Products.Where(过滤器);
返回products.ToList();
}
我要的是类似于以下,但不能找出代码通过创建表达式中的顺序。
无效的主要()
{
的DateTime productSince = DateTime.UtcNow。减去(新的TimeSpan(1,30,0));
表达式来; Func键<产品,布尔>>过滤器= D => d.CreatedDate> productSince&功放;&安培; d.Price< 100;
表达式来; Func键<产品,????>> ORDERBY = D => ??????;
名单,LT;产品>产品=的GetProducts(过滤器,排序依据,产品);
Console.WriteLine(产品);
}
私人静态列表<产品>的GetProducts(表达式来; Func键<产品,布尔>>过滤器,
表达式来; Func键<产品,???>>的OrderBy,表<产品>产品)
{
变种产品= Products.Where(过滤器).OrderBy(排序依据);
返回products.ToList();
}
如果你想知道,我使用LinqPad这个概念证明。
私有静态列表<产品>的GetProducts< TOrderBy>(表达式来; Func键<产品,布尔>>过滤器,
表达式来; Func键<产品,TOrderBy>>的OrderBy,表<产品>产品)
{
变种产品= Products.Where(过滤器).OrderBy(排序依据);
返回products.ToList();
}
如果你看的OrderBy扩展方法它接受表达式来; Func键< T,TOrderBy>>
,因为表达可导致任何类型取决于
.OrderBy(X => x.ID)//< T,INT>
.OrderBy(X => x.Name)//< T,串>
所以,为此您的包装方法需要能够接受泛型类型的传递。
I'm creating a proof of concept that uses Labmda/LINQ for dynamic where and orderby. The following code works for the where expression, but I can not figure out how to create an order by expression. For this exmample, if possible I would like to keep it simple; I would rather not write code that modifies an Expression Tree.
void Main()
{
DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;
List<Products> products = GetProducts(filter, Products);
Console.WriteLine(products);
}
private static List<Products> GetProducts(Expression<Func<Products, bool>> filter, Table<Products> Products)
{
var products = Products.Where(filter);
return products.ToList();
}
What I want is similar to the following but can not figure out the code to create the order by expression.
void Main()
{
DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;
Expression<Func<Products, ????>> orderBy = d => ??????;
List<Products> products = GetProducts(filter, orderBy, Products);
Console.WriteLine(products);
}
private static List<Products> GetProducts(Expression<Func<Products, bool>> filter,
Expression<Func<Products, ???>> orderBy, Table<Products> Products)
{
var products = Products.Where(filter).OrderBy(orderBy);
return products.ToList();
}
If you are wondering, I'm using LinqPad for this proof of concept.
private static List<Products> GetProducts<TOrderBy>(Expression<Func<Products, bool>> filter,
Expression<Func<Products, TOrderBy>> orderBy, Table<Products> Products)
{
var products = Products.Where(filter).OrderBy(orderBy);
return products.ToList();
}
If you look at OrderBy extension method it accepts a Expression<Func<T, TOrderBy>>
because the expression can result in any type depending
.OrderBy(x => x.ID) // <T, int>
.OrderBy(x => x.Name) // <T, string>
So therefor your wrapper method needs to be able to accept that generic type to pass in.
这篇关于创建LINQ /的Lamda的排序依据表达的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!