LINQ查询返回一个结果

6

如果您有一个只应返回一个结果的选择LINQ查询,那么是否必须要使用foreach循环来获取结果?

还是有更好的方法吗?

5个回答

19
// 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()


3
您可以使用.Single(predicate)替换.Where(predicate).Single() - Mehrdad Afshari
1
如果序列中存在多个项,Single()将引发异常。 如果您不想抛出异常,也可以使用First()或FirstOrDefault()。 - LBushkin
@Mehrdad - 我已经做出了更改,但这两种方法之间是否有性能差异?通常我更喜欢使用.Where(predicate).Single(),因为我认为它更清晰地表达了我的意图。 - Justin Niessner
@Justin:我怀疑性能差异不大。表达式树会稍微冗长一些,但生成的 SQL 应该是相似的。SingleOrDefault 也有类似的重载。我更喜欢这些,因为它们更简洁。顺便说一下,如果元素包含恰好一个元素,则 Single 将返回该元素,否则将抛出异常。 - Mehrdad Afshari
@Justin: 你可能会有一个非常微小的差异,因为使用两种方法链会创建一个额外的枚举器对象。然而,由于现在对象的创建非常快,你可能永远不会注意到这一点。 - R. Martinho Fernandes
@Mehrdad - 由于OP说查询应该只返回一个结果,所以我使用了Single()SingleOrDefault()。如果他说查询返回多个结果并且他只需要第一个,我会建议使用First()FirstOrDefault()。至于风格,你可能是对的。我只是在回到SQL时代。 - Justin Niessner

6
var myLinqObj = db.MyObjects.Take(1).SingleOrDefault();

5
你可以使用 First 或者 SingleFirst 无论有多行还是只有一行,都会返回第一行。 Single 只期望返回一行,如果有多行则会抛出异常。
因此,如果你只期望返回一行,Single 可能是更好的选择,这样你就可以立即看到问题并进行故障排除。

2
你可以像这样使用 .First() 或 .FirstOrDefault() :
Foo foo = query.Select(a => a.Name == "foo").FirstOrDefault();

1
如果查询“应该只返回一个结果”,使用Single更有效,因为如果查询返回多个结果,则会抛出异常并标记错误。 - R. Martinho Fernandes

0

从所有人的发言中,我的补充是如果你正在使用LINQ-to-XML,那么在获得单个元素后使用Value属性。

如果是列表、数组或表格,则使用Select new { *cols* }。 例如。 ... select new {c.Name, c.Value};

这个提示是为了让你获取值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接