2012-04-06 40 views
3

我正在與前一個問題的幫助,但再叫要求與其相關的新的問題,但考慮到代碼中,我碰到一個錯誤:沒有添加linq語法的定義?

public void AddPersonToCommunity(string person, string communityName) 
{ 
    var result = communities.Where(n => String.Equals(n.CommunityName, communityName)).FirstOrDefault(); 
    if (result != null) 
    { 
     result.Add(new Person() { PersonName = person }); //no definition for add? 
    } 
} 

你可以在這裏看到前面的問題的更多細節: relationships in rest?

如果我這樣做var result = communities;結果會有添加的定義,所以我不知道發生了什麼事情?

+0

這將工作,而不是firstordefault你使用tolist,以便結果是一個集合,而不是一個單一的實體。儘管添加到數據庫中會有什麼進展? – 2012-04-06 22:56:22

回答

7

你打電話Where()它會返回一個IEnumerable<Community>(無Add方法),然後FirstOrDefault()返回一個Community(也沒有Add方法)。你會在哪裏預計Add方法來自哪裏?

我懷疑你真的

if (result != null) 
{ 
    result.People.Add(new Person { PersonName = person }); 
} 

...因爲Community.People是該社區的人的名單,對不對?

請注意,如果你這樣做var result = communities;有確實將一個Add方法 - 但與Add(Community)簽名,Add(Person)

重要的是要保持所有事物的類型。這實際上與LINQ幾乎沒有關係。你會看到同樣的結果,如果你想嘗試:

Community community = new Community(); 
community.Add(new Person { PersonName = person }); 
+0

謝謝喬恩會在一分鐘內嘗試 – 2012-04-06 23:13:04

0

添加到@喬恩的答案

沒有爲IEnumerable<T>一個Concat擴展方法,它允許你在兩個IEnumerable<T>對象邏輯地組合成一個單一的其中跨兩個集合的IEnumerable<T>。您可以將此邏輯擴展爲附加單個元素,然後將其應用於您當前的情況。

public static IEnumerable<T> Concat(this IEnumerable<T> enumerable, T value) { 
    foreach (var cur in enumerable) { 
    yield return cur; 
    } 
    yield return value; 
} 

... 

result = result.Concat(new Person() { PersonName = person }); 
相關問題