2009-12-18 192 views

回答

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

你可以使用。首先()或.FirstOrDefault()像这样:

Foo foo = query.Select(a => a.Name == "foo").FirstOrDefault(); 
+1

如果查询“**应该**只返回一个结果”单个更有效,因为如果查询返回多个查询,它会抛出更多错误,并标记错误。 – 2009-12-18 18:36:07

+0

@Martinho Fernandes你是对的,我从来没有使用过单一的 – 2009-12-18 20:41:25

18
// 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); 

感谢迈赫达德的评论......这两条线有已更新。

如果您的查询可能导致返回多条记录,则(如注释中所述)Single()SingleOrDefault()是调用的错误方法。您将保持相同的语法,但分别请拨打First()FirstOrDefault()

+3

你可以用'.Single(predicate)'替换'.Where(predicate).Single()'。 – 2009-12-18 18:33:35

+1

如果序列中存在多个单个项目,Single()将引发异常。如果你不在意抛出异常,你也可以使用First()或FirstOrDefault()。 – LBushkin 2009-12-18 18:35:06

+0

@Mehrdad - 我做了改变,但两者之间有什么表现差异?我通常更喜欢.Where(谓词).Single(),因为我认为它表达我的意图更清晰一些。 – 2009-12-18 18:36:32

5

您可以使用FirstSingle

First返回第一行,无论是多行还是只有一行。

Single预计只返回一行,如果有多行则抛出异常。

Single因此可能是一个更好的选择,如果您希望只有一行,以便您能够立即看到问题并且可以排除故障。

0

从所有已经表示,如果您使用的是LINQ到XML,我的另外一点是在使用单个元素之后使用Value属性。

Select new { *cols* }如果它是一个列表或数组或表。 示例。 ...选择新的{c.Name,c.Value};

这个技巧是为了让你获得价值。