Linq-to-Entities Include method not found
Я использую EF4 в приложении MVC3, и я искал способ просмотра всех моих контактов в данной рабочей группе. В контроллере я указал:
var wg = from w in _repo.Workgroups.Include("Contact").ToList();
но я получаю следующую ошибку:
'System.Linq.IQueryable' не содержит определения для "Include" и не может быть найден метод расширения "Include", принимающий первый аргумент типа "System.Linq.IQueryable" (вам не хватает директивы using или ссылка на сборку?)
Хотя этот метод был встроен в EF4. Должен ли я включить его каким-то образом?
Ответы
Ответ 1
Да, метод встроен в EF, но он недоступен в интерфейсе IQueryable
. Он доступен на ObjectQuery
. Если вы хотите называть его IQueryable
, вы должны создать собственное расширение, которое преобразует текущий запрос в ObjectQuery
и выполнит Include
. Что-то вроде:
public static IQueryable<T> Include<T>(this IQueryable<T> query, string property)
{
var objectQuery = query as ObjectQuery<T>;
if (objectQuery == null)
{
throw new NotSupportedException("Include can be called only on ObjectQuery");
}
return objectQuery.Include(property);
}
Или вы должны использовать Entity Framework Feature CTP5, где такие расширения уже доступны.
Ответ 2
Я также получил эту ошибку и разрешил ее, добавив следующую ссылку:
using System.Data.Entity;
Ответ 3
Ответ Брюса Хилла абсолютно прав.
Чтобы немного расширить свой ответ, методы Include являются методами расширения в пространстве имен System.Data.Entity.
Это не влияет на то, как вы их используете, но методы Include на самом деле определены в статическом классе с именем DbExtensions. На msdn.microsoft.com вы увидите, что они задокументированы там, а не в System.Linq.IQueryable, что делает их немного сложнее найти.
Ответ 4
Если эта проблема исходит из хранимой процедуры, убедитесь, что SP работает нормально.
Entity Framework попытается предсказать тип возвращаемого значения из хранимой процедуры, и если SP не работает из-за недопустимого имени таблицы или столбца внутри него, он возвращает Integer, а Entity Framework создает концептуальную схему, ожидающую целое число как возвращаемое значение вместо таблицы.