实体框架 - 通过同一列中的多个条件选择 - 引用表
本文关键字:选择 引用 一列 条件 框架 实体 | 更新日期: 2023-09-27 18:31:51
示例场景:
两个表:订单和订单项,关系一对多。
我想选择至少有一个价格为 100 的订单商品和至少一个价格为 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();
但是,如果这些条件是用户生成的呢?所以我不知道会有多少条件。
您需要
使用如下所示的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();
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。如果订单值的数量相当稳定,那么这个特定的查询应该可以正常工作。