Метод 'SingleOrDefault' не поддерживается Linq to Entities - PullRequest
2 голосов
/ 20 апреля 2010

Я читал другие сообщения о схожей проблеме использования SingleOfDefault в Linq-To-Entity, некоторые предлагали использовать «First ()», а другие предлагали использовать метод «Extension» для реализации Single ().

Этот код выдает исключение:

Movie movie  = (from a in movies
                where a.MovieID == '12345'
                  select a).SingleOrDefault();

Если я преобразую объектный запрос в список с помощью .ToList (), «SingleOrDefault ()» фактически работает без каких-либо ошибок.

Мой вопрос: разве не хорошо конвертировать в List? Будет ли проблема производительности для более сложных запросов? Что это переводится в SQL?

Movie  movie  = (from a in movies.ToList()
                where a.MovieID == '12345'
                  select a).SingleOrDefault();

Ответы [ 3 ]

5 голосов
/ 20 апреля 2010

Это не поддерживается на уровне провайдера, если дело касается команды сущностей linq 2, но есть способы, чтобы проверить здесь .

Но, насколько мне известно, теперь поддерживается в .NET 4.

3 голосов
/ 20 апреля 2010

В общем случае нецелесообразно вызывать .ToList () или .AsEnumerable (), поскольку он заставляет запрос обрабатываться и все данные извлекаются из SQL.

В вашем примере .ToList () находится в особенно плохом положении, так как он будет загружать ВСЕ фильмы. Было бы лучше сначала выполнить where, а затем ToList.

Кратчайшая форма того, что вы хотите в EF до EF4, будет: -

var movie = movies.FirstOrDefault(a => a.MovieID = 12345);

Использование одного в базе данных путем превращения MovieID в первичный ключ - это лучший способ обеспечить только один фильм с любым заданным идентификатором.

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

SingleOrDefault поддерживается в LinqToEntities (4).

Я предполагаю, что вы используете EF 3.5?

Нет простого способа сделать 1 или ноль.

Я бы написал расширение, которое использует счетчик, который хорошо масштабировался бы.

  public static TElement SingleOrDefault<TElement>
  (this IQueryable<TElement> query)
 {
    if (query.Count() > 1)
   {
        throw new Exception();
   }
   return query.FirstOrDefault();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...