2011-04-01 71 views
3

這可能非常簡單,但只需要一些幫助就可以使語法正確! 比方說,我有2類A,B。使用LINQ獲得財產

class A 
{ 
    string empname; 
    string id; 
    Child[] ca; 
} 

class Child 
{ 
    string id; 
    string name; 
} 

class B 
{ 
    string empname; 
    string id; 
    Child[] cb; 
} 

我要地圖ca.name到cb.name。條件是cb.id = ca.id.如何在linq做到這一點?我嘗試以下方式:

ca.name=b.Child.select(x=>x.id.Equals(ca.id)) //here how to map the name property? 
+0

你的「孩子」課程的相關性是什麼? – 2011-04-01 15:30:32

回答

2

你是什麼意思時,你說的地圖?你想要名稱的地方是平等的?你的課似乎是有點過,從你的例子訪問規範的條款,並從你的例子不知道,如果你的數組的名字是真的CB或孩子,我會承擔孩子,但正確的,因爲需要...

基本上有幾種選擇:

  • Single() - 返回一個且只有一個,並拋出如果沒有或多個。

  • SingleOrDefault() - 如果存在,默認情況下如果不返回之一,將引發多個

  • First() - 如果存在,將引發不返回第一個。

  • FirstOrDefault() - 返回第一個存在,如果不存在,則返回第一個。

所有這些都有謂詞重載,所以你不需要一個where子句。如果你已經知道你的物品是獨一無二的,我建議FirstOrDefault(),因爲它發現它後停止,而Single()必須掃描整個列表,這可能會有點貴。

var item = b.Child.FirstOrDefault(x => x.id == ca.id); 

if (item != null) 
{ 
    ca.name = item.name; 
} 

或者你可以使用與空合併一個地方/選擇組合:

var name = b.Child.Where(x => x.id == ca.id) 
     .Select(x => x.name) 
     .FirstOrDefault() ?? "unknown"; 
+0

凡()讓你一個範圍,如果你想在第一場比賽(或默認(空的類);如果沒有匹配)使用FirstOrDefault() – 2011-04-01 15:32:29

+0

我該怎麼辦連在一個語句中檢查空嗎?另外,var name = b.Child.FirstOrDefault(x => x.id == ca.ID);返回對象b,我們不能做ca.name = name; – user583126 2011-04-01 15:52:21

+0

糾正了缺陷,你是對的,它確實返回的項目,而不是名稱。您可以返回整個項目w FirstOrDefault() - 使用較少的鏈接 - 或者您可以使用Where/Select/First組合將名稱縮小到名稱 – 2011-04-01 18:30:13

2

你可能想Where代替Select

+0

我建議FirstOrDefault()在這裏,因爲這裏爲您提供了一個範圍,而不是第一個(希望只)比賽 – 2011-04-01 15:35:27

+0

這是真的,但我可以從疑問,提問者是仍處於早期階段看:誤將「選擇」了本質上是SQL關鍵字。他可能會想到一個列表的結果(如在SQL) – sehe 2011-04-01 15:38:49

0

嗯,除非我誤解你的問題,答案是相當瑣碎:

 ca.name=b.Child.Where(x=>x.id.Equals(ca.id)).SingleOrDefault().Name; 
+0

可以消除帶FirstOrDefault過載並帶有謂詞的位置 – 2011-04-01 15:34:51

+1

'.SingleOrDefault ().Name'沒有多大意義。如果您認爲可能沒有匹配的項目,那麼您應該檢查以確保SingleOrDefault在嘗試讀取Name屬性之前未返回null。如果你知道總會有一個匹配的項目,你應該使用Single來代替。 – Aaron 2011-04-01 15:35:55

+0

+1不會認定它。要麼處理來自Single()的異常,要麼檢查null,要麼使用null-coalescing?運營商 – 2011-04-01 15:47:59

0

使用join從句:

var pairs= 
    from a in ca  
    join b in cb on a.id equals b.id 
    select new {a, b}; 
1

我可能這樣做:

var query = from innerItem in cb.cb 
      where item.id.Equals(item.id) 
      select innerItem; 

if (query != null) 
{ 
    item.name = query.Single().name; 
} 

問候。