如果您有一个只应返回一个结果的选择LINQ查询,那么是否必须要使用foreach循环来获取结果?
还是有更好的方法吗?
// Will return a default value if no object is found in the DB
db.Table.SingleOrDefault(x => x.something == someParameter);
或者// Will throw an exception if records are not found
db.Table.Single(x => x.something == someParameter);
感谢Mehrdad的评论...两行代码已经更新。
如果你的查询可能返回多条记录,那么(如评论中所提到的)调用Single()
和SingleOrDefault()
方法是错误的。你应该保持相同的语法,但分别调用First()
和FirstOrDefault()
。
var myLinqObj = db.MyObjects.Take(1).SingleOrDefault();
First
或者 Single
。
First
无论有多行还是只有一行,都会返回第一行。
Single
只期望返回一行,如果有多行则会抛出异常。Single
可能是更好的选择,这样你就可以立即看到问题并进行故障排除。Foo foo = query.Select(a => a.Name == "foo").FirstOrDefault();
从所有人的发言中,我的补充是如果你正在使用LINQ-to-XML,那么在获得单个元素后使用Value
属性。
如果是列表、数组或表格,则使用Select new { *cols* }
。
例如。
... select new {c.Name, c.Value};
这个提示是为了让你获取值。
.Single(predicate)
替换.Where(predicate).Single()
。 - Mehrdad AfshariSingleOrDefault
也有类似的重载。我更喜欢这些,因为它们更简洁。顺便说一下,如果元素包含恰好一个元素,则Single
将返回该元素,否则将抛出异常。 - Mehrdad AfshariSingle()
和SingleOrDefault()
。如果他说查询返回多个结果并且他只需要第一个,我会建议使用First()
和FirstOrDefault()
。至于风格,你可能是对的。我只是在回到SQL时代。 - Justin Niessner