左joinLINQ到实体?
我正在尝试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();
但是这会产生与内连接相同的结果,而不是左连接。
而且,它创build了这个完全疯狂的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看起来像这样:
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
啊,知道了。
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()
,你会得到一个内部连接。
那是我正在寻找的。
你可以在这里阅读我为LINQ写的文章
var query = from u in Repo.T_Benutzer join bg in Repo.T_Benutzer_Benutzergruppen on u.BE_ID equals bg.BEBG_BE into temp from j in temp.DefaultIfEmpty() select new { BE_User = u.BE_User, BEBG_BG = (int?)j.BEBG_BG// == null ? -1 : j.BEBG_BG //, bg.Name }
以下是使用扩展方法的等效方法:
var query = Repo.T_Benutzer .GroupJoin ( Repo.T_Benutzer_Benutzergruppen, x=>x.BE_ID, x=>x.BEBG_BE, (o,i)=>new {o,i} ) .SelectMany ( x => xiDefaultIfEmpty(), (o,i) => new { BE_User = ooBE_User, BEBG_BG = (int?)i.BEBG_BG } );
可能是我后来回答,但现在我面对这个…如果有帮助还有一个解决scheme(我解决它的方式)。
var query2 = ( from users in Repo.T_Benutzer join mappings in Repo.T_Benutzer_Benutzergruppen on mappings.BEBG_BE equals users.BE_ID into tmpMapp join groups in Repo.T_Benutzergruppen on groups.ID equals mappings.BEBG_BG into tmpGroups from mappings in tmpMapp.DefaultIfEmpty() from groups in tmpGroups.DefaultIfEmpty() select new { UserId = users.BE_ID ,UserName = users.BE_User ,UserGroupId = mappings.BEBG_BG ,GroupName = groups.Name } );
顺便说一句,我尝试使用Stefan Steiger代码,这也有帮助,但速度较慢。
你不仅可以在实体中使用它,也可以在存储过程或其他数据源中使用它:
var customer = (from cus in _billingCommonservice.BillingUnit.CustomerRepository.GetAll() join man in _billingCommonservice.BillingUnit.FunctionRepository.ManagersCustomerValue() on cus.CustomerID equals man.CustomerID // start left join into a from b in a.DefaultIfEmpty(new DJBL_uspGetAllManagerCustomer_Result() ) select new { cus.MobileNo1,b.ActiveStatus });