示例场景:
两个表:订单和 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();
但如果这些条件是用户生成的呢? 所以我不知道会有多少条件。
答案 0 :(得分:1)
您需要使用Where
和Any
方法遍历所有值,如下所示:
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();
答案 1 :(得分: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。如果订单值的数量相当稳定,那么这个特定的查询应该可以正常工作。