簡體   English   中英

左/右連接查詢中的多個連接

[英]Left/right join with several joins in the query

我有一個參考表,在此表中有3個字段( IdUser1User2 )。 User2字段可以為空,但是在不使用時我們使用0。

當我執行下面的Linq查詢時, User2 == 0的記錄不是結果的一部分。

在這種情況下如何進行左/右連接?

class MyReference
{
    public int Id { get; set; }
    public int User1 { get; set; }
    public int User2 { get; set; }
}

class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class MyClassResult
{
    public int Id { get; set; }
    public string U1FirstName { get; set; }
    public string U2FirstName { get; set; }
}

var result =
    (from myReference in context.MyReference
     join u1 in context.USER on myReference.User1 equals User.Id
     join u2 in context.USER on myReference.User2 equals User.Id
     select new MyClassResult
     {
         Id = myReference.Id,
         U1FirstName = u1.FirstName,
         U2FirstName = u2.FirstName
     }).ToList();

您必須使用into keyword和DefaultIfEmpty來獲取null元素:

var result = (from myReference in context.MyReference
                join u1 in context.USER on myReference.User1 equals u1.Id
                join u2 in context.USER on myReference.User2 equals u2.Id into x2
                from un2 in x2.DefaultIfEmpty()
                select
                    new MyClassResult {
                        Id = myReference.Id, 
                        U1FirstName = u1.FirstName, 
                        U2FirstName = un2 != null ? un2.FirstName : null
                    });

作為替代方案,特別是如果myReference.User1也可以為0 ,則可以在最終選擇之前使用let關鍵字獲取用戶信息:

var result = (from myReference in context.MyReference
            let u1 = users.FirstOrDefault(u => u.Id == myReference.User1)
            let u2 = users.FirstOrDefault(u => u.Id == myReference.User2)
            select
            new MyClassResult {
                Id = myReference.Id,
                U1FirstName = u1 != null ? u1.FirstName : null,
                U2FirstName = u2 != null ? u2.FirstName : null
            });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM