SingleOrDefault()的最佳实践

rad*_*byx 4 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...)
}
Run Code Online (Sandbox Code Playgroud)

-

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

-

编辑:

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

Mar*_*kXA 10

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

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

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


Gio*_*rgi 6

您应该在第二种情况下使用FirstOrDefault,因为如果有多个项目,SingleOrDefault将抛出异常.你觉得可以吗?

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