Лучшая практика SingleOrDefault () - PullRequest
4 голосов
/ 28 декабря 2010

Я хочу сделать мой код лучше. Можно ли смело переписать первый пример на второй?

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:

Извините, что не ясно. Моя проблема заключается в том, чтобы получить объект PDF напрямую, без предварительного использования списка. Я не хочу проверять счетчик больше 0 и потому что он не очень хорошо выглядит.

Ответы [ 4 ]

10 голосов
/ 28 декабря 2010

Да, это выглядит безопасно.Вы также можете немного упростить запрос:

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

Единственное различие между SingleOrDefault и FirstOrDefault заключается в том, что SingleOrDefault выдает исключение, если найдено более одного совпадения, поэтому, если вы не захотите эту проверку, то вы можете такжепридерживаться FirstOrDefault.

6 голосов
/ 28 декабря 2010

Вы должны использовать FirstOrDefault и во втором случае, так как SingleOrDefault сгенерирует исключение, если имеется более одного элемента. Это нормально для тебя?

С другой стороны, если вы хотите гарантировать, что для некоторого идентификатора существует только один объект pdf, лучше использовать SignleOrDefault.

3 голосов
/ 28 декабря 2010

Если гарантируется, что в нем всегда 0 или 1 ряд, тогда, конечно, SingleOrDefault - лучшее решение.

0 голосов
/ 28 декабря 2010

Да, вы добьетесь того же результата, я не вижу никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...