2010-01-31 3 views
9

Почему я получаю эту ошибку:Ошибка, метод не поддерживается LINQ для лиц

Метод «Single» не поддерживается LINQ к Entities. Вместо этого попробуйте использовать метод «Первый».

  public ActionResult Details(int id) 
Line 27: {    
      var result = (from d in _db.MovieSet 
Line 29:  where d.Id == id 
Line 30:  select d).Single(); 
      // 
      // 
      } 

код компилирует безопасно, но перерывы только если вызов выполняется в соответствующем разделе. Я новичок в LINQ, поэтому не знаю, какие методы предназначены для LINQtoSQL или LINQtoEntities. Это означает больше ошибок! Мы не можем запомнить все методы таким образом.

Мой вопрос в том, существуют ли ограничения для методов, применимых к определенным типам/сценариям, почему они появляются в Intellisense?

EDIT: Любое обходное/техническое средство полезно иметь идею, если она поддерживается?

ответ

6

У Microsoft есть полный list of supported and unsupported methods в Linq to Entities. Вот куда пойти, чтобы узнать эту информацию.

Вы заметите, что методы Single и SingleOrDefault фактически перечислены как «не поддерживаются» в разделе «Методы пейджинга».

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

+1

Исправить (+1) для EF 1. Обратите внимание, однако, что оба метода поддерживаются в EF 4. –

6

В случае LINQtoSQL/Entities все запросы разбиваются на деревья выражений, которые затем передаются API-интерфейсам провайдера. Поставщики не могут предоставлять информацию о времени компиляции деревьев, которые они делают или не поддерживают, поскольку нет синтаксической разницы. Единственный выбор - предоставить им данные времени выполнения.

Например, один раз в форме дерева выражений как Single, так и First отображаются как экземпляр MethodCallExpression.

+0

Любая идея, как знать или просто «практиковать, сделать человека идеальным»? –

+1

@Asad, многие провайдеры имеют список звонков, которые они поддерживают в своей документации, но не допуская, что это пробная версия и ошибка :( – JaredPar

Смежные вопросы