LINQ to Entites: Как мне обрабатывать System.InvalidOperationException при проверке существования элемента? - PullRequest
1 голос
/ 14 апреля 2010

У меня есть отношение многие-к-одному, которое пользователи могут редактировать с помощью флажков. PK Foo - это идентификатор, а fid содержит идентификатор из флажка.

Я проверяю, существует ли элемент с:

Foo ent;
try
{
  ent = ctx.Foo.First(f => f.ID == fid);
}
catch (System.InvalidOperationException ioe)
{
  ent = new Foo();
}

Мне кажется, что я должен быть в состоянии сделать это без исключения. Каков наилучший способ сделать это?

1 Ответ

1 голос
/ 14 апреля 2010

Полученное InvalidOperationException сообщение:

Sequence contains no matching element

Поведение First заключается в том, что он выдает это исключение, если элемент не найден.

Вы можете использовать FirstOrDefault вместо First и проверить null. Для этой проверки можно использовать оператор слияния нуля (??).

Foo ent = ctx.Foo.FirstOrDefault(f => f.ID == fid) ?? new Foo();

Обратите внимание, что есть аналогичная пара функций Single и SingleOrDefault, которые выдают исключение, если найдено более одного соответствующего элемента. В вашем конкретном случае, предполагая, что идентификаторы должны быть уникальными, было бы более целесообразно использовать SingleOrDefault.

...