2011-03-09 51 views
0

我有兩個表,Orders和Customers,Orders引用Customers,以及它們的映射類Order和Customer。將列上的Lambda表達式添加到Linq .Where()

我想寫接收一個LINQ兩個訂單和客戶在哪裏()使用狀況的方法:即使在MSDN上的這一主題,相關的文章閱讀大量SO答案後

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
     Expression<Func<Customer, bool>> customerCondition) 
{ 
    var q = Database.Query<Order>().Where(orderCondition); 
    q = q.Where(o => o.Customer APPLY customerCondition); // how ? 

    ... process records in q ... 
} 

,看來我無法弄清楚如何在Order.Customer屬性上應用客戶條件。

(使用的DB/ORM是Oracle/DevExpress,但是我沒有使用通用解決方案,所以我沒有將它們包含在標籤中,請提及您的答案是否僅限於特定的DB或ORM)

回答

0

這是實現它的一種方法。

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
     Expression<Func<Customer, bool>> customerCondition>>) 
{ 
    var orders = Database.Query<Order>().Where(orderCondition); 
    var customers = Database.Query<Customer>().Where(customerCondition); 

    var q = from o in orders join c in customers on o.CustomerId == c.Id 
      select new {o, c} 
} 

再次,取決於ORM,這樣的事情也可以工作(我在這裏假設延遲加載Customer.Orders集合屬性):

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
     Expression<Func<Customer, bool>> customerCondition>>) 
{ 
    var customers = Database.Query<Customer>().Where(customerCondition); 

    var q = from c in customers 
      let orders = c.Orders.Where(orderCondition) 
      select new {c, orders} 

} 

任何解決方案具有對被測試具體的LINQ提供程序,因爲不同的LINQ提供可能會或可能不支持某些查詢...

+0

感謝您提出JOIN,Linq似乎偶爾會雲化我的db知識。但是,DevExpress不支持連接,因此我的解決方案由customer.Where()查詢組成,並且使用該查詢的.Contains()限制訂單。醜陋的SQL,但它似乎工作。 – devio 2011-03-10 16:30:30

0

你可以嘗試這樣的事:

var q = (from o in Database.Query<Order>().Where(orderCondition) 
     join c in Database.Query<Customer>().Where(customerCondition) on o.CustomerID equals c.CustomerID 
     select new { Order = o, Customer = c });