【发布时间】:2009-08-12 08:49:01
【问题描述】:
我需要在条件为ORs 而不是ANDs 的多个条件上进行左连接。我找到了很多后者的样本,但我很难为我的场景找到正确的答案。
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() }
我正在获取从 a 返回的记录数 - 而不是 b 中匹配的记录数。
编辑:
我会把答案告诉 Jon - 我已经解决了我的计数问题 - 我没有意识到我可以使用 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 }分组? -
作为基本的左连接选择工作正常 - 如果这是一个基本的等连接,则从分组中取出计数的行为并不像我预期的那样。请注意上面的额外信息。
标签: c# linq-to-sql