2012-04-06 80 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