2012-04-20 71 views
3

示例方案:
两个表:为了OrderItem的,关系一对多。
我要选择具有至少一个OrderItem的价格与100和至少一个OrderItem的同价位200 所有的订单,我可以做这样的:实体框架 - 在同一列的多个条件选择 - 引用表

var orders = (from o in kontextdbs.orders 
       join oi in kontextdbs.order_item on o.id equals oi.order_id 
       join oi2 in kontextdbs.order_item on o.id equals oi2.order_id 
       where oi.price == 100 && oi2.price == 200 
       select o).Distinct();  

但是,如果这些条件有哪些用户产生的? 所以我不知道会有多少条件。

回答

1

你通过所有的值需要循环使用WhereAny方法是这样的:

List<int> values= new List() { 100, 200 }; 

var orders = from o in kontextdbs.orders 
      select o; 
foreach(int value in values) 
{  
     int tmpValue = value; 
     orders = orders.Where(x => kontextdbs.order_item.Where(oi => x.id == oi.order_id) 
                 .Any(oi => oi.price == tmpValue));  
} 

orders = orders.Distinct(); 
+0

谢谢..这和我想要的完全一样:) – quin61 2012-04-21 08:13:17

0
List<int> orderValues = new List() { 100, 200 }; 

ObjectQuery<Order> orders = kontextdbs.Orders; 
foreach(int value in orderValues) { 
    orders = (ObjectQuery<Order>)(from o in orders 
            join oi in kontextdbs.order_item 
            on o.id equals oi.order_id 
            where oi.price == value 
            select o); 
} 
orders = orders.Distinct(); 

应该工作,或者至少这是一般模式 - 您可以在每个阶段对IObjectQueryables应用额外的查询。

请注意,根据我的经验,使用EF生成动态查询会带来可怕的性能,不幸的是 - 它首次将特定模式编译为SQL时花费几秒钟的时间。如果订单值的数量相当稳定,那么这个特定的查询应该可以正常工作。

+0

这个发现有价格的所有订单100或200 – quin61 2012-04-21 08:14:50

+0

不,我刚刚测试了这一点,它的工作原理对于我来说足够了。我每次都在对象查询的顶部组成一个额外的过滤器 - 这怎么可以用来构造一个OR? Aducci也完全一样 - 如果他得到AND而不是OR,你能解释这个代码不会怎么样吗? (我可能更喜欢他的答案 - 我不应该尝试自己使用类似SQL的语法,并坚持我所知道的 - 但这很好。) – Rup 2012-04-22 08:33:27