LINQ:根据每个项目有条件地加入两个不同的表

时间:2015-07-16 14:38:40

标签: c# linq

有没有办法在if声明中设置linq

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

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

实施此方法的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

请注意,以下内容并未解决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 });

快速写下来。您需要使两个查询上的匿名类型兼容。这是唯一重要的事情。

答案 1 :(得分:3)

您可以执行LEFT JOIN,LEFT JOIN的其中一个条件可能是您在IF子句中的条件。因此,您始终执行所有LEFT JOIN,但只有当IF cluase中的条件为真时,它们才会返回结果。

另一种方式,具有更好的性能,是创建一个存储过程并从EF调用它。