簡體   English   中英

嵌套左聯接的C#Linq表達式

[英]C# Linq expression for nested left join

我想在linq表達式中格式化嵌套的左聯接。 我已經下載了LINQPad4,但是它似乎沒有能力將SQL轉換為linq。

我不明白如何獲得嵌套的左聯接。 我試圖用'into'子句操縱表達式無濟於事。


Linq表情

from cli in Clients
join er in EntityRelationships on cli.EGUID equals er.ParentID
join con in Contacts on er.ChildID equals con.EGUID

join erEmail in EntityRelationships on er.EGUID equals erEmail.ParentID into erIfAny
from r in erIfAny.DefaultIfEmpty()
join ea in EmailAddresses on r.ChildID equals ea.EGUID
join eaDefault in EntityDefaultValues on r.ID equals eaDefault.RelationshipID

where cli.ClientID == 6
select new
{
    ContactID = con.ContactID,
    ContactLastName = con.ContactLastName,
    ContactFirstName = con.ContactFirstName,
    ContactTitle = con.ContactTitle,
    EmailAddress = ea
}).Distinct()

產生以下SQL語句

DECLARE @p0 Int = 6

SELECT DISTINCT con.*, ea.*
FROM Clients AS cli
INNER JOIN EntityRelationships AS er ON cli.eGUID = er.ParentID
INNER JOIN Contacts AS con ON er.ChildID = con.eGUID

LEFT OUTER JOIN EntityRelationships AS erEmail ON er.eGUID = erEmail.ParentID
INNER JOIN EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID
INNER JOIN EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID

WHERE cli.ClientID = @p0

但是,我需要將左后的兩個內部聯接像這樣包裹在左內。

DECLARE @p0 Int = 6

SELECT DISTINCT con.*, ea.*
FROM Clients AS cli
INNER JOIN EntityRelationships AS er ON cli.eGUID = er.ParentID
INNER JOIN Contacts AS con ON er.ChildID = con.eGUID

LEFT OUTER JOIN EntityRelationships AS erEmail
    INNER JOIN EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID
    INNER JOIN EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID
ON er.eGUID = erEmail.ParentID

WHERE cli.ClientID = @p0

我的linq表情應該是什么樣?


編輯:

不知道我能做到這一點,但最終我只是寫了內聯SQL。

var query = db.Database.SqlQuery<ContactViewModel>(
"select distinct con.*, ea.Value as EmailAddress " +
"from Clients AS cli " +
"join EntityRelationships AS er ON cli.eGUID = er.ParentID " +
"join Contacts AS con ON er.ChildID = con.eGUID " +
"left join EntityRelationships AS erEmail " +
    "join EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID " +
    "join EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID " +
"on er.eGUID = erEmail.ParentID " +
"where cli.ClientID=" + cID.ToString() + " " +
"order by con.ContactLastName, con.ContactFirstName");

對於人們來說,嘗試獲取LINQ代碼以匹配他們以前使用的SQL是一個非常常見的錯誤。 由於SQL僅限於扁平化的結果集,而面向對象的代碼可以表示更豐富的層次數據,因此,如果您不再對SQL方面的問題進行過多思考,則很可能可以在LINQ查詢中更好地建模您真正想要的東西。

我不完全確定您要在這里做什么,但是通常情況下,LINQ中的左外連接最終看起來像一個對象,並且其屬性之一具有其他對象:

from cli in Clients
where cli.ClientID == 6
join er in EntityRelationships on cli.EGUID equals er.ParentID
join con in Contacts on er.ChildID equals con.EGUID
select new
{
    ContactID = con.ContactID,
    ContactLastName = con.ContactLastName,
    ContactFirstName = con.ContactFirstName,
    ContactTitle = con.ContactTitle,
    Emails = 
        from erEmail in EntityRelationships
        where er.EGUID == erEmail.ParentID
        join ea in EmailAddresses on r.ChildID equals ea.EGUID
        where EntityDefaultValues.Any(eaDefault => r.ID == eaDefault.RelationshipID
        select ea
}

暫無
暫無

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

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