第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

LINQ中的左外連接

LINQ中的左外連接

阿波羅的戰(zhàn)車 2019-05-30 12:47:57
LINQ中的左外連接如何在C#LINQ對象中不使用join-on-equals-into條款?有沒有辦法where條款?正確的問題:因為內(nèi)部連接很容易,我有這樣的解決方案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; }
查看完整描述

4 回答

?
MMTTMM

TA貢獻1869條經(jīng)驗 獲得超4個贊

如下文所述:

101 LINQ樣本.左外連接

var q =
    from c in categories
    join p in products on c.Category equals p.Category into ps    from p in ps.DefaultIfEmpty()
    select new { Category = c, ProductName = p == null ? "(No products)" : p.ProductName };


查看完整回答
反對 回復 2019-05-30
?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

如果使用數(shù)據(jù)庫驅(qū)動的LINQ提供程序,則可以這樣編寫更易讀的左外部聯(lián)接:

from maintable in Repo.T_Whatever 
from xxx in Repo.T_ANY_TABLE.Where(join condition).DefaultIfEmpty()

如果你忽略了DefaultIfEmpty()你會有一個內(nèi)在的連接。

接受的答案:

  from c in categories
    join p in products on c equals p.Category into ps    from p in ps.DefaultIfEmpty()

這個語法非?;靵y,當您想離開JOIN多個表時,不清楚它是如何工作的。


應該指出,from alias in Repo.whatever.Where(condition).DefaultIfEmpty()與外部應用/左連接橫向相同,任何(體面的)數(shù)據(jù)庫優(yōu)化器都完全能夠?qū)⑵滢D(zhuǎn)換為左連接,只要您不引入一行值(也就是實際的外部應用)。不要在Linq-2對象中這樣做(因為當您使用Linqto-Objects時沒有DB優(yōu)化器)。

詳細實例

var query2 = (
    from users in Repo.T_User    from mappings in Repo.T_User_Group         .Where(mapping => mapping.USRGRP_USR == users.USR_ID)
         .DefaultIfEmpty() // <== makes join left join
    from groups in Repo.T_Group         .Where(gruppe => gruppe.GRP_ID == mappings.USRGRP_GRP)
         .DefaultIfEmpty() // <== makes join left join

    // where users.USR_Name.Contains(keyword)
    // || mappings.USRGRP_USR.Equals(666)  
    // || mappings.USRGRP_USR == 666 
    // || groups.Name.Contains(keyword)

    select new
    {
         UserId = users.USR_ID        ,UserName = users.USR_User        ,UserGroupId = groups.ID        ,GroupName = groups.Name
    });var xy = (query2).ToList();

當與LINQ 2 SQL一起使用時,它將很好地轉(zhuǎn)換成以下非常清晰的SQL查詢:

SELECT 
     users.USR_ID AS UserId 
    ,users.USR_User AS UserName 
    ,groups.ID AS UserGroupId 
    ,groups.Name AS GroupName FROM T_User AS users

LEFT JOIN T_User_Group AS mappings
   ON mappings.USRGRP_USR = users.USR_ID

LEFT JOIN T_Group AS groups
    ON groups.GRP_ID == mappings.USRGRP_GRP

編輯:

亦見“將SQLServer查詢轉(zhuǎn)換為Linq查詢“一個更復雜的例子。

另外,如果您在Linq-2-對象(而不是Linq-2-SQL)中執(zhí)行此操作,則應該采用老式的方法(因為LINQ to SQL可以正確地將其轉(zhuǎn)換為聯(lián)接操作,但是對于對象,此方法強制進行完全掃描,并且不利用索引搜索,為什么.):

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


查看完整回答
反對 回復 2019-05-30
  • 4 回答
  • 0 關注
  • 1063 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號