LEFT JOIN 在 LINQ 中加入实体?

编程入门 行业动态 更新时间:2024-10-26 10:35:56
本文介绍了LEFT JOIN 在 LINQ 中加入实体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在试用 LINQ to entity.

我有以下问题:我希望它这样做:

SELECTT_Benutzer.BE_User,T_Benutzer_Benutzergruppen.BEBG_BEFROM T_Benutzer左加入 T_Benutzer_BenutzergruppenON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID

我最接近的是这个:

var lol = (来自你在 Repo.T_Benutzer//其中 u.BE_ID == 1来自 Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty() 中的 o//在 u.BE_ID 上等于 o.BEBG_BE其中 (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null)//在 Repo.T_Benutzergruppen.DefaultIfEmpty() 中加入 bg//在 o.BEBG_BG 上等于 bg.ID//其中bg.ID == 899订购单u.BE_Name 升序//, bg.Name 降序//选择你选择新的{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]交叉连接(选择[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]开 1 = 1) AS [Join1]WHERE [Extent1].[BE_ID] = [Join1].[BEBG_BE]或 [Join1].[BEBG_BE] 为空ORDER BY [Extent1].[BE_Name] ASC

如何在 LINQ-2-entities 中进行左连接另一个人仍然可以理解该代码在做什么?

最好是生成的 SQL 看起来像这样:

SELECTT_Benutzer.BE_User,T_Benutzer_Benutzergruppen.BEBG_BEFROM T_Benutzer左加入 T_Benutzer_BenutzergruppenON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID

解决方案

啊,自己搞定.LINQ-2 实体的怪癖和夸克.这看起来最容易理解:

var query2 = (来自 Repo.T_Benutzer 中的用户来自 Repo.T_Benutzer_Benutzergruppen 中的映射.Where(mapping => mapping.BEBG_BE == users.BE_ID).DefaultIfEmpty()来自 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(关键字)选择新的{UserId = users.BE_ID,UserName = users.BE_User,UserGroupId = mappings.BEBG_BG,GroupName = groups.Name});var xy = (query2).ToList();

移除.DefaultIfEmpty(),你会得到一个内连接.这就是我要找的.

I'm trying out LINQ to entities.

I have a problem with the following: I want it to do this:

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

the closest thing I've come to is this:

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();

But this generates the same results as an inner join, and not a left join. Moreover, it creates this completely crazy 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

How can I do a left join in LINQ-2-entities in a way where another person can still understand what's being done in that code ?

and most-preferably where the generated SQL looks like:

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

解决方案

Ah, got it myselfs. The quirks and quarks of LINQ-2-entities. This looks most understandable:

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();

Remove the .DefaultIfEmpty(), and you get an inner join. That was what I was looking for.

更多推荐

LEFT JOIN 在 LINQ 中加入实体?

本文发布于:2023-06-03 10:03:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/473722.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实体   LEFT   JOIN   LINQ

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!