LINQ:根据每个项目有条件地连接到两个不同的表
本文关键字:两个 项目 LINQ 有条件 项目有 连接 | 更新日期: 2023-09-27 18:03:15
是否有办法在linq
语句中设置if
?
return(from x in db.products where x.id == id
if(x.type == 1){
join y in db.category1 on x.idItem equals y.id
}else if(x.type == 2){
join z in db.category2 on x.idItem equals z.id
}
select New {....}).ToList();
我知道这段代码是错误的,但我的问题是:
实现这个的最好方法是什么?
注意,下面的操作不能解决OP遇到的问题,因为连接谓词依赖于每个项。如果一次性知道整个查询的条件,下面的命令会有帮助:
分割查询:
var part1 = from x in db.products where x.id == id select x;
var part2 =
b ? (from x in part1 join db.category1 select { x, joinedItem }) :
(from x in part1 join db.category2 select { x, joinedItem });
很快写好了。您需要使两个查询上的匿名类型兼容。这是唯一重要的。
您可以执行LEFT JOIN,并且LEFT JOIN的其中一个条件可能是IF子句中的条件。因此,您总是执行所有的左连接,但它们只会在IF语句中的条件为真时返回结果。
另一种性能更好的方法是创建一个存储过程并从EF调用它。