【问题标题】:How does DefaultIfEmpty() imply left outer join?DefaultIfEmpty() 如何暗示左外连接?
【发布时间】:2016-02-24 15:49:50
【问题描述】:

这是怎么做到的:

from c in Contacts
join a in Addresses
on c.Address_ID equals a.Address_ID
into Temp
from d in Temp.DefaultIfEmpty()
where c.First_Name.ToUpper().Contains("Pin".ToUpper())
select new { id = c.Contact_ID, value = (c.First_Name??"") + " " + (c.Last_Name??"") + " " + (c.Company_Name??""), FirstName = c.First_Name, LastName = c.Last_Name, AddressFull = d.Address_Full, Phone = c.Phone, Email = c.Email, CompanyName = c.Company_Name }

翻译成这个(使用 LinqPad)?

SELECT [t0].[Contact_ID] AS [id], ((((COALESCE([t0].[First_Name],@p1)) + @p2) + (COALESCE([t0].[Last_Name],@p3))) + @p4) + (COALESCE([t0].[Company_Name],@p5)) AS [value], [t0].[First_Name] AS [FirstName], [t0].[Last_Name] AS [LastName], [t1].[Address_Full] AS [AddressFull], [t0].[Phone], [t0].[Email], [t0].[Company_Name] AS [CompanyName]
FROM [Contact] AS [t0]
LEFT OUTER JOIN [Address] AS [t1] ON [t0].[Address_ID] = ([t1].[Address_ID])
WHERE UPPER([t0].[First_Name]) LIKE @p0

好像Temp.DefaultIfEmpty() == LEFT OUTER JOIN

这种语法背后的原因是什么?有人可以雄辩地解释原因吗?

【问题讨论】:

  • 单击 Linqpad 中的“lambda”选项卡。查询的 fluent-LINQ 等效项将回答您的问题。
  • @GertArnold 非常感谢!

标签: c# sql linq-to-sql linqpad


【解决方案1】:

这不是魔法咒语。使用纯 LINQ to Objects 可以获得相同的语义。 join into 已经是左连接。它将所有匹配的项目放入一个集合中。可以有零个或多个。

from d in Temp.DefaultIfEmpty() 将是一个内连接,因为如果没有匹配的项目,我们将删除外行。 DefaultIfEmpty 现在可用于添加“dummy null”以使其成为左连接。

整个模式有点尴尬,但背后有逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2011-10-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多