我需要在条件为OR
s而不是AND
s的多个条件下执行左连接。我发现了很多后者的样本,但我正努力为我的场景获得正确的答案。Linq - 在多个(或)条件下的左连接
from a in tablea
join b in tableb on new { a.col1, a.col2 } equals new { b.col1, b.col2 }
group a by a into g
select new() { col1 = a.col1, col2 = a.col2, count = g.Count() }
适用于所有条件必须匹配的连接。我需要加入匹配on a.col1 = b.col1 OR a.col2 = b.col2
。
我知道这一定很容易,但我已经空白了!
编辑:
给一点更多的信息,查询的目的是为了获得一个包含所有从“A”加的匹配记录在“B”的计数领域的投影。我已经修改了上面的示例来试图说明我的内容。当我用上述方法运行Jon Skeet注意到的方法时,我得到的是a中所有记录的计数,而不是b中相关记录的计数。
基本左连接工作正常:
from a in tablea
from b in tableb
.Where(b => (a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
select new { col1 = a.col1, col2 = a.col2 }
如果我修改它来分组添加如下
from a in tablea
from b in tableb
.Where(b => (a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
group a by a.col1 into g
select new { col1 = g.Key, count = g.Count() }
我得到的记录的计数从返回 - 而不是b中匹配的记录数。
编辑:
我给的答案乔恩 - 我已经解决了我的问题,计数 - 我没有意识到我可以用一个LAMDA过滤计数(g.Count(x => x != null))
。另外,我需要按照上面的方式将b组合为a而不是a。这给出了正确的结果,但SQL不如我手写的那样高效,因为它增加了一个相关的子查询 - 如果任何人都可以建议一种更好的写法来模拟下面的SQL,我会很感激!
select a.col1, count(b.col1)
from tablea a
left join tableb b
on a.col1 = b.col1
or a.col2 = b.col2
group by a.col1
我建议你尝试我的查询*没有分组,看看是否得到你期望的结果。如果确实如此,那么试着找出为什么分组失败。也许按'new {a.col1,a.col2}'分组? – 2009-08-12 09:06:12
作为一个基本的左连接选择正常工作 - 如果这是一个基本的等连接,从组中获得计数的行为并不像我预期的那样。请注意上面的额外信息。 – 2009-08-12 09:25:57