2012-01-16 67 views
4

我構建了一個自定義的IQueryable提供程序。該提供者將查詢例如如何使用Linq.Expressions查詢集合

c.PurchaseDate == new DateTime(2011, 11, 29) && c.Name == "Elizabeth Brown" 

從底層代碼到System.Linq.Expressions.Expression

現在我需要使用LINQ查詢運行它們對這個集合

IQueryable<Customer> customers = _customers.AsQueryable(); 

誰能告訴我如何用Expression查詢集合?

感謝

回答

3
//Query = c.PurchaseDate == new DateTime(2011, 11, 29) && c.Name 
    // == "Elizabeth Brown") 
IQueryable<Customer> customers = _customers.AsQueryable<Customer>(); 

//Predicate parameter 
ParameterExpression parameter = Expression.Parameter(typeof(Customer), 
                  "customer"); 

//Create left expression 
Expression left = Expression.Property(parameter, typeof(Customer) 
            .GetProperty("PurchaseDate")); 
Expression right = Expression.Constant(new DateTime(2011, 11, 29)); 
Expression leftExp = Expression.Equal(left, right); 

//Create right expression tree 
left = Expression.Property(parameter, typeof(Customer).GetProperty("Name")); 
right = Expression.Constant("Elizabeth Brown", typeof(string)); 
Expression rightExp = Expression.Equal(left, right); 

//Combine the expressions into expression tree 
Expression expressionTree = Expression.AndAlso(leftExp, rightExp); 

//Create an expression tree that represents the expression 
MethodCallExpression methodCall = Expression.Call(
    typeof(Queryable), 
    "Where", 
    new Type[] { customers.ElementType }, 
    customers.Expression, 
    Expression 
       .Lambda<Func<Customer, bool>> 
       (expressionTree, new ParameterExpression[] { parameter })); 

// Create an executable query from the expression tree. 
IQueryable<Customer> results = 
       customers.Provider.CreateQuery<Customer>(methodCall); 

// Enumerate the results 
foreach (Customer customer in results) 
{ 
    Console.WriteLine("{0} {1}", customer.Name, customer.PurchaseDate); 
} 

Console.ReadLine(); 

我完成了這樣的任務。 IQueryable是真的很奇妙的東西。請享用!

+0

哇!這令人印象深刻! 「Expression left = Expression.Property(pe,typeof(Customer)'應該有'parameter'而不是'pe'吧? – gideon 2012-01-17 08:38:37

+0

實際上,在您的現實生活中,您必須重寫一個抽象ExpressionVisitor類來訪問並擠出這些值在運行時,但爲了演示的目的,我在靜態上下文中創建了這三個表達式值 – user1135594 2012-01-17 14:15:02

+0

是的,你是對的我在準備示例時犯了一個錯誤,但現在已經糾正了。爲了說明我創建了lambda子句的左和右表達式,相應的c.PurchaseDate == new DateTime(2011,11,29)&& c.Name ==「Elizabeth Brown」ParameterExpression參數只定義類型和參數c本身。 – user1135594 2012-01-17 21:55:52