LINQ中的左外连接

LINQ中的左外连接

如何在C#LINQ对象中不使用join-on-equals-into条款?有没有办法where条款?正确的问题:因为内部连接很容易,我有这样的解决方案

List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
                             select new JoinPair { LeftId = l.Id, RightId = r.Id})

但对于左外接,我需要一个解决方案。我的是这样的,但不起作用

List< JoinPair> leftFinal = (from l in lefts from r in rights                             select new JoinPair { 
                                            LeftId = l.Id, 
                                            RightId = ((l.Key==r.Key) ? r.Id : 0
                                        })

JoinPair是一个类:

public class JoinPair { long leftId; long rightId; }


阿波罗的战车
浏览 1000回答 4
4回答

MMTTMM

如下文所述:101 LINQ样本.左外连接var&nbsp;q&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;c&nbsp;in&nbsp;categories &nbsp;&nbsp;&nbsp;&nbsp;join&nbsp;p&nbsp;in&nbsp;products&nbsp;on&nbsp;c.Category&nbsp;equals&nbsp;p.Category&nbsp;into&nbsp;ps&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;p&nbsp;in&nbsp;ps.DefaultIfEmpty() &nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;new&nbsp;{&nbsp;Category&nbsp;=&nbsp;c,&nbsp;ProductName&nbsp;=&nbsp;p&nbsp;==&nbsp;null&nbsp;?&nbsp;"(No&nbsp;products)"&nbsp;:&nbsp;p.ProductName&nbsp;};

神不在的星期二

如果使用数据库驱动的LINQ提供程序,则可以这样编写更易读的左外部联接:from&nbsp;maintable&nbsp;in&nbsp;Repo.T_Whatever&nbsp; from&nbsp;xxx&nbsp;in&nbsp;Repo.T_ANY_TABLE.Where(join&nbsp;condition).DefaultIfEmpty()如果你忽略了DefaultIfEmpty()你会有一个内在的连接。接受的答案:&nbsp;&nbsp;from&nbsp;c&nbsp;in&nbsp;categories &nbsp;&nbsp;&nbsp;&nbsp;join&nbsp;p&nbsp;in&nbsp;products&nbsp;on&nbsp;c&nbsp;equals&nbsp;p.Category&nbsp;into&nbsp;ps&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;p&nbsp;in&nbsp;ps.DefaultIfEmpty()这个语法非常混乱,当您想离开JOIN多个表时,不清楚它是如何工作的。注应该指出,from alias in Repo.whatever.Where(condition).DefaultIfEmpty()与外部应用/左连接横向相同,任何(体面的)数据库优化器都完全能够将其转换为左连接,只要您不引入一行值(也就是实际的外部应用)。不要在Linq-2对象中这样做(因为当您使用Linqto-Objects时没有DB优化器)。详细实例var&nbsp;query2&nbsp;=&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;users&nbsp;in&nbsp;Repo.T_User&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;mappings&nbsp;in&nbsp;Repo.T_User_Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(mapping&nbsp;=>&nbsp;mapping.USRGRP_USR&nbsp;==&nbsp;users.USR_ID) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.DefaultIfEmpty()&nbsp;//&nbsp;<==&nbsp;makes&nbsp;join&nbsp;left&nbsp;join &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;groups&nbsp;in&nbsp;Repo.T_Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(gruppe&nbsp;=>&nbsp;gruppe.GRP_ID&nbsp;==&nbsp;mappings.USRGRP_GRP) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.DefaultIfEmpty()&nbsp;//&nbsp;<==&nbsp;makes&nbsp;join&nbsp;left&nbsp;join &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;where&nbsp;users.USR_Name.Contains(keyword) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;||&nbsp;mappings.USRGRP_USR.Equals(666)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;||&nbsp;mappings.USRGRP_USR&nbsp;==&nbsp;666&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;||&nbsp;groups.Name.Contains(keyword) &nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;new &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserId&nbsp;=&nbsp;users.USR_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,UserName&nbsp;=&nbsp;users.USR_User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,UserGroupId&nbsp;=&nbsp;groups.ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,GroupName&nbsp;=&nbsp;groups.Name &nbsp;&nbsp;&nbsp;&nbsp;});var&nbsp;xy&nbsp;=&nbsp;(query2).ToList();当与LINQ 2 SQL一起使用时,它将很好地转换成以下非常清晰的SQL查询:SELECT&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users.USR_ID&nbsp;AS&nbsp;UserId&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;,users.USR_User&nbsp;AS&nbsp;UserName&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;,groups.ID&nbsp;AS&nbsp;UserGroupId&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;,groups.Name&nbsp;AS&nbsp;GroupName&nbsp;FROM&nbsp;T_User&nbsp;AS&nbsp;users LEFT&nbsp;JOIN&nbsp;T_User_Group&nbsp;AS&nbsp;mappings &nbsp;&nbsp;&nbsp;ON&nbsp;mappings.USRGRP_USR&nbsp;=&nbsp;users.USR_ID LEFT&nbsp;JOIN&nbsp;T_Group&nbsp;AS&nbsp;groups &nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;groups.GRP_ID&nbsp;==&nbsp;mappings.USRGRP_GRP编辑:亦见“将SQLServer查询转换为Linq查询“一个更复杂的例子。另外,如果您在Linq-2-对象(而不是Linq-2-SQL)中执行此操作,则应该采用老式的方法(因为LINQ to SQL可以正确地将其转换为联接操作,但是对于对象,此方法强制进行完全扫描,并且不利用索引搜索,为什么.):&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;query2&nbsp;=&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;users&nbsp;in&nbsp;Repo.T_Benutzer &nbsp;&nbsp;&nbsp;&nbsp;join&nbsp;mappings&nbsp;in&nbsp;Repo.T_Benutzer_Benutzergruppen&nbsp;on&nbsp;mappings.BEBG_BE&nbsp;equals&nbsp;users.BE_ID&nbsp;into&nbsp;tmpMapp &nbsp;&nbsp;&nbsp;&nbsp;join&nbsp;groups&nbsp;in&nbsp;Repo.T_Benutzergruppen&nbsp;on&nbsp;groups.ID&nbsp;equals&nbsp;mappings.BEBG_BG&nbsp;into&nbsp;tmpGroups&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;mappings&nbsp;in&nbsp;tmpMapp.DefaultIfEmpty() &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;groups&nbsp;in&nbsp;tmpGroups.DefaultIfEmpty() &nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;new &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserId&nbsp;=&nbsp;users.BE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,UserName&nbsp;=&nbsp;users.BE_User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,UserGroupId&nbsp;=&nbsp;mappings.BEBG_BG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,GroupName&nbsp;=&nbsp;groups.Name &nbsp;&nbsp;&nbsp;&nbsp;});
打开App,查看更多内容
随时随地看视频慕课网APP