radbyx
radbyx

Reputation: 9650

Best practice of SingleOrDefault()

I want to make my code better. Can I safely rewrite the first example to the second?

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
}

--

EDIT:

Sorry for not being clear. My issue is to get the PDF object out directly without having to use a list first. I don't want to make a check for count is greater than 0 and because it just doesn't look good.

Upvotes: 4

Views: 20517

Answers (4)

Giorgi
Giorgi

Reputation: 30873

You should use FirstOrDefault in the second case too as SingleOrDefault will throw an exception if there is more than one item. Is that ok for you?

On the other hand if you want to guarantee that there is only one pdfobject for some id than using SignleOrDefault is better.

Upvotes: 6

MarkXA
MarkXA

Reputation: 4384

Yes, that looks safe. You can also simplify your query slightly:

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

The only difference between SingleOrDefault and FirstOrDefault is that SingleOrDefault will throw an exception if more than one match is found, so unless you want this check then you may as well stick to FirstOrDefault.

Upvotes: 10

fejesjoco
fejesjoco

Reputation: 11903

If it's guaranteed that it always has 0 or 1 rows, then sure, SingleOrDefault is the best solution.

Upvotes: 3

Amit Bagga
Amit Bagga

Reputation: 648

Yes you will achieve the same result, I don't see any issue.

Upvotes: 0

Related Questions