如何在LINQ to Entities中进行左连接(LEFT JOIN)?

9

我花了最近两天的时间试图找出如何在LINQ中进行真正的LEFT JOIN,但是我没有成功。 我有一个用户表,其中有一个“Primary2Address”列,它可能经常为空。 所以我必须在这里进行LEFT JOIN。此外,在地址表中,我还有更多可能为空的关系,因此我必须进行多个LEFT JOINS。
每次我尝试使用LINQ时,都会输出一些严重疯狂的SQL语句,包括UNIONS,嵌套SELECT语句和更多奇怪的东西。
我只需要:

SELECT u.UserName FROM Users u 
LEFT JOIN Addresses a ON a.AddressiD = u.Primary2Address
LEFT JOIN States s ON s.StateID = a.Address2State
LEFT JOIN Countries c ON c.CountryID = a.CountryID

请帮忙! 到目前为止,我的解决方法是创建一个存储过程,使用我上面的SQL语句,但我真的很想尝试使用LINQ(L2E)来完成这个任务。谢谢!


3
你的查询与仅使用 SELECT u.UserName FROM Users u 有何不同? - svick
1个回答

19

DefaultIfEmpty 用于 EntityFramework 4+ 的左连接查询。

var query = from u in context.Users
            from a in context.Addresses
                             .Where(x => u.Primary2Address == x.AddressiD)
                             .DefaultIfEmpty()
            from s in context.States
                             .Where(x => a.Address2State == x.StateID)
                             .DefaultIfEmpty()
            from c in context.Countries
                             .Where(x => a.CountryID == x.CountryID)
                             .DefaultIfEmpty()
            select u.UserName;

你是我的英雄!哇,经过这么多小时...你的查询就像它们一样直截了当,我现在明白了。非常感谢你,Aducci! - Losbear
根据@svick在问题中的评论,这与from u in context.Users select u.UserName有何不同? - AakashM
@AakashM - 如果任何用户有多个地址,您将获得不同的结果。更重要的是,我认为问题已经被简化了。 - Aducci
DefaultIfEmpty 返回什么?MSDN 上说如果序列为空,则返回默认值单例集合。 - Ian Boyd
2
@IanBoyd - 如果类型是类,则返回null;如果类型是整数,则返回0,等等... - Aducci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接