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

我知道这段代码是错误的,但我的问题是:

实现这个的最好方法是什么?

LINQ:根据每个项目有条件地连接到两个不同的表

注意,下面的操作不能解决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调用它。