我正在尝试将LINQ用于实体。
我在以下方面遇到问题:我希望它这样做:
SELECT T_Benutzer.BE_User ,T_Benutzer_Benutzergruppen.BEBG_BE FROM T_Benutzer LEFT JOIN T_Benutzer_Benutzergruppen ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID
我最接近的是:
var lol = ( from u in Repo.T_Benutzer //where u.BE_ID == 1 from o in Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty() // on u.BE_ID equals o.BEBG_BE where (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null) //join bg in Repo.T_Benutzergruppen.DefaultIfEmpty() // on o.BEBG_BG equals bg.ID //where bg.ID == 899 orderby u.BE_Name ascending //, bg.Name descending //select u select new { u.BE_User ,o.BEBG_BG //, bg.Name } ).ToList();
但这会产生与内部联接相同的结果,而不是与左联接相同的结果。 而且,它创建了这个完全疯狂的SQL:
SELECT [Extent1].[BE_ID] AS [BE_ID] ,[Extent1].[BE_User] AS [BE_User] ,[Join1].[BEBG_BG] AS [BEBG_BG] FROM [dbo].[T_Benutzer] AS [Extent1] CROSS JOIN ( SELECT [Extent2].[BEBG_BE] AS [BEBG_BE] ,[Extent2].[BEBG_BG] AS [BEBG_BG] FROM ( SELECT 1 AS X ) AS [SingleRowTable1] LEFT OUTER JOIN [dbo].[T_Benutzer_Benutzergruppen] AS [Extent2] ON 1 = 1 ) AS [Join1] WHERE [Extent1].[BE_ID] = [Join1].[BEBG_BE] OR [Join1].[BEBG_BE] IS NULL ORDER BY [Extent1].[BE_Name] ASC
我如何在LINQ-2实体中进行左联接,使其他人仍然可以理解该代码中正在执行的操作?
最优选的是生成的SQL如下所示:
啊,自己弄。 LINQ-2实体的怪癖和夸克。 这看起来最容易理解:
var query2 = ( from users in Repo.T_Benutzer from mappings in Repo.T_Benutzer_Benutzergruppen .Where(mapping => mapping.BEBG_BE == users.BE_ID).DefaultIfEmpty() from groups in Repo.T_Benutzergruppen .Where(gruppe => gruppe.ID == mappings.BEBG_BG).DefaultIfEmpty() //where users.BE_Name.Contains(keyword) // //|| mappings.BEBG_BE.Equals(666) //|| mappings.BEBG_BE == 666 //|| groups.Name.Contains(keyword) select new { UserId = users.BE_ID ,UserName = users.BE_User ,UserGroupId = mappings.BEBG_BG ,GroupName = groups.Name } ); var xy = (query2).ToList();
删除.DefaultIfEmpty(),您将获得一个内部联接。 那就是我想要的。
.DefaultIfEmpty()