2011-03-09 9 views
0

Customers, Order를 참조하는 Orders 및 Customers 테이블과 Order 클래스 및 Customer 테이블이 두 개 있습니다.Linq .Where()에 열에 람다 식 추가

내가 주문 및 고객 모두를위한 경우() A 조건 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

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