2011-01-31 73 views
5

該查詢返回員工ID,姓名,公司ID,公司名稱和公司城市。我缺少員工電子郵件地址(存儲在EmployeeEmailAddress表中的emailAddress)和員工電話號碼(存儲在EmployeePhoneNumbers表中的phoneNumber)。.SelectMany()並從多個相關表中獲取數據

我需要添加.SelectMany()以獲取母公司關係並訪問公司ID,姓名和城市。但是,現在,我無法訪問PersonOrgMap表中找不到的任何屬性。我無法導航到任何其他表格。刪除.SelectMany()允許我導航到其他表,但我無法訪問母公司信息。

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => x.ChildPersonOrgMaps) 
.Select (c => new { employeeId = c.Child.ContactID, 
      c.Child.FirstName, 
      c.Child.LastName, 
      companyId = c.ParentContactID, 
      c.Parent.OrganizationName, 
      c.Parent.City 
     } 
     ) 
.OrderBy (c =>c.LastName).ThenBy(x => x.FirstName) 
.Dump(); 

回答

5

這是查詢表達式真正幫助的地方。如果你像這樣開頭的查詢:

from c in Contacts 
where c.ContactAttributes.Any (ca => ca.AttributeID == 1153)) 
from om in c.ChildPersonOrgMaps 
... 

,你將有機會獲得兩個ÇOM變量以後查詢。 C#通過選擇一個臨時匿名類型將「攜帶」原始變量轉換爲SelectMany調用。看到這個的最好方法是將查詢作爲查詢表達式寫入LINQPad中,然後查看lambda選項卡以查看翻譯成流利的語法。

+4

+1爲無恥的LINQPad插頭;-)非常好的產品! – DenaliHardtail 2011-02-01 14:22:34

0

我同意Joe Albahari--使用查詢語法。這是我所知道的一件事情,你可以通過查詢來完成,而不能使用方法語法。

您可以嘗試選擇一個包含父母和子對象的匿名類型,但我不認爲EF會非常喜歡它。

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => new { Parent = x, Child = x.ChildPersonOrgMaps }) 
// etc 
16

如果你是熱衷於方法的語法,再有就是對的SelectMany()的重載,也使您可以訪問無論是「源」和「結果」的對象:

.SelectMany(x => x.ChildPersonOrgMaps, (x, c) => new { x, c }) 
.Select(xc => new 
{ 
    xc.x.Attribute1, 
    xc.x.Attribute2, 
    xc.c.Child.Attribute3, 
    xc.c.Attribute4 
});