[英]Left/right join with several joins in the query
我有一個參考表,在此表中有3個字段( Id
, User1
, User2
)。 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.