SingleOrDefault()的最佳实践

时间:2010-12-28 10:00:01

标签: c# linq-to-sql

我想让我的代码变得更好。我可以安全地将第一个例子改写为第二个例子吗?

IQueryable<PDF> pdfList = (from pdfobj in pdfDataContext.PDFs
                           where pdfobj.Id == pdfId
                           select pdfobj);
if (pdfList.Count() > 0)
{
  PDF pdfOldWay = pdfList.FirstOrDefault();
  pdfOldWay. // do something. (pdfOldWay can't be null here...)
}

-

PDF pdfNewWay = (from pdfobj in pdfDataContext.PDFs 
                 where pdfobj.Id == pdfId 
                 select pdfobj).SingleOrDefault();
if (pdfNewWay != null)
{
  // do something
}

-

修改

很抱歉不清楚。我的问题是直接获取PDF对象而不必先使用列表。我不想检查计数是否大于0,因为它看起来不太好。

4 个答案:

答案 0 :(得分:10)

是的,这看起来很安全。您还可以稍微简化您的查询:

PDF pdfNewWay = pdfDataContext.PDFs.SingleOrDefault(p => p.Id == pdfId);
if (pdfNewWay != null)
{
  // do something
}

SingleOrDefault和FirstOrDefault之间的唯一区别是,如果找到多个匹配项,SingleOrDefault将抛出异常,因此除非您需要此检查,否则您可以坚持使用FirstOrDefault。

答案 1 :(得分:6)

你应该在第二种情况下使用FirstOrDefault,因为如果有多个项目,SingleOrDefault会抛出异常。你还好吗?

另一方面,如果你想保证某个id只有一个pdfobject比使用SignleOrDefault更好。

答案 2 :(得分:3)

如果确保它总是有0行或1行,那么确定,SingleOrDefault是最好的解决方案。

答案 3 :(得分:0)

是的,你会得到相同的结果,我没有看到任何问题。