创建LINQ /的Lamda的排序依据表达 [英] Create an OrderBy Expression for LINQ/Lamda

查看:118
本文介绍了创建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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆