2011-04-23 107 views
11

我正在创建一个使用Lambda/LINQ for dynamic where和orderby的概念证明。以下代码适用于where表达式,但我无法弄清楚如何通过表达式创建顺序。对于这个例子,如果可能的话,我想保持简单;我宁愿不编写修改表达式树的代码。为LINQ/Lambda创建OrderBy表达式

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(); 
} 

我想要的是类似于以下,但不能找出代码来创建按顺序的顺序。

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(); 
} 

如果您想知道,我正在使用LinqPad进行此类概念验证。

回答

17
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(); 
} 

如果你看的OrderBy扩展方法它接受Expression<Func<T, TOrderBy>>,因为表达可导致任何类型取决于

.OrderBy(x => x.ID) // <T, int> 
.OrderBy(x => x.Name) // <T, string> 

所以,为此您的包装方法需要能够接受泛型类型传递在

+0

感谢您的回答,但我如何参考TOrderBy? – 2011-04-23 19:10:51

+0

你不这样做,它被orderBy参数使用。 'Expression > orderBy' – 2011-04-23 19:12:40

+1

为了帮助他人。要创建orderBy表达式,可以使用'Expression > orderBy = d => d.Price;'。价格是十进制类型。在前面的代码中,小数可以是任何类型,例如DateTime,string或int。此类型需要匹配从expresion返回的类型。如果使用DateTime,则lambda表达式应该是d.CreatedDate之类的东西。 – 2011-04-23 19:26:52

12

你正在寻找的是:

Expression<Func<Products, dynamic>>; 

尝试创建一个结构/类来同时拥有Expression和如果它是升序或降序。