2012-04-06 19 views
2

我希望我命名這個問題是正確的,我可以正確解釋我的意思。我有一個列表<>已從數據庫和我的控制器填充的ViewModel我試圖通過項目的屬性值之一訪問該列表中的特定單個項目,並更改另一個屬性值。.NET MVC 3 C#訪問單個列表<model>項目

例如我的模型可能有幾個屬性:

public int Id { get; set; } 
    public bool IsChanged { get; set; } 

,我想通過「ID」來訪問它,並改變「IsChanged」屬性,像這樣(我使用#的周圍的部分,我不知道)

list.#(select item in the list by it's Id)#.IsChanged = true; 

我希望這是有道理的,即使你可能有一個很好的鏈接到一個教程, 感謝:-)

回答

3

如果我理解正確的話,如果沒有匹配使用Single會導致一個空的錯誤,我寧願使用SingleOrDefault這將返回空,如果沒有匹配...這可能是一個安全的方法:

if(list != null) 
{ 
    var item = list.SingleOrDefault(x => x.Id == 1); 
    if(item !=null) 
    { 
    item.IsChanged = true; 
    } 
    else 
    { 
    // code to handle this case 
    } 
} 
else 
{ 
    // code to handle this case 
} 

這是迄今爲止我已經閱讀LINQ最好的書... LINQ to Objects Using C# 4.0

乾杯......

+0

這本身並不安全。它不會崩潰,但它在語義上是正確的做法?如果沒有物品被發現,你基本上什麼都不做。但這可能是一個錯誤。 – usr 2012-04-06 22:21:34

+0

感謝您的快速響應,工作過一次! – Adam 2012-04-06 22:25:10

+0

@usr謝謝......修復了我的答案......但我只是建議一種更安全的方法,沒有任何違規......只有當你確定某個集合中的某個查詢會有項目時,才應該使用Single。 ..這就是爲什麼我們有一個SingleOrDefault,所以我們可以處理空情況......你只是不能寫代碼,可以拋出異常...... – NiK 2012-04-06 22:44:30

2
list.Single(x => x.Id == 123).IsChanged = true; 

Single()方法期望只有一個滿足該查詢的項目,因此您需要確保您的Id是唯一的。

如果沒有項目滿足查詢,將會拋出ArgumentNullException。如果多於一個項目滿足查詢,則會拋出InvalidOperationException

如果您試圖訪問的屬性是引用類型,您可能需要額外的檢查以確保它已被實例化。

+1

@Adam - 這是執行查詢的正確方法,是剛許多查詢方法之一avai標籤作爲LINQ to Entities的一部分(請參閱http://msdn.microsoft.com/en-us/library/bb738550.aspx獲取完整列表) – 2012-04-06 21:56:55

+0

@JonathanS。不一定與你意見不一致,但你仍然必須處理例外情況,如果你的表現對你很重要,那麼你也可以自己陷入錯誤。 – 2012-04-06 22:15:37

+0

感謝您的快速反應,努力了一份享受! @JonathanS我明白你自己在說什麼來捕捉錯誤,但請記住:-) – Adam 2012-04-06 22:24:50