Метод не может быть переведен в выражение магазина - PullRequest
84 голосов
/ 02 октября 2010

Я видел, как этот код работает с LINQ to SQL, но когда я использую Entity Framework, он выдает эту ошибку:

LINQ to Entities не распознает метод 'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()', и этот метод нельзя преобразовать в выражение хранилища.

Код хранилища:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList - это список, расширяющий возможности IQueryable.

Может кто-нибудь объяснить, почему возникает эта ошибка?

1 Ответ

110 голосов
/ 03 октября 2010

Причина: Конструктивно LINQ to Entities требует, чтобы все выражение запроса LINQ было преобразовано в запрос сервера. Только несколько некоррелированных подвыражений (выражений в запросе, которые не зависят от результатов с сервера) оцениваются на клиенте до перевода запроса. Произвольные вызовы методов, которые не имеют известного перевода, например, GetHomeFeatures () в этом случае, не поддерживаются.
Более конкретно, LINQ to Entities поддерживает только конструкторы без параметров и Initializer .

Решение: Поэтому, чтобы преодолеть это исключение, вам нужно объединить свой подзапрос с основным для GetCommunityFeatures () и GetHomeFeatures () вместо прямого вызова методов из запроса LINQ. Кроме того, существует проблема в строках, когда вы пытались создать новый экземпляр LazyList , используя его параметризованные конструкторы, как вы, возможно, делали в LINQ to SQL . Для этого решением было бы переключиться на клиентскую оценку запросов LINQ (LINQ to Objects). Это потребует от вас вызова метода AsEnumerable для запросов LINQ to Entities перед вызовом конструктора LazyList.

Примерно так должно работать:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates.AsEnumerable()
       let AllCommFeat = from f in entity.CommunityFeatures
                         select new CommunityFeatures {
                             Name = f.CommunityFeature1,
                             CommunityFeatureId = f.CommunityFeatureId
                         },
       let AllHomeFeat = from f in entity.HomeFeatures
                         select new HomeFeatures() {
                             Name = f.HomeFeature1,
                             HomeFeatureId = f.HomeFeatureId
                         },
       select new Models.Estate {
            EstateId = e.EstateId,
            AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Подробнее: Пожалуйста, посмотрите LINQ to Entities, что не поддерживается? для получения дополнительной информации. Также проверьте LINQ to Entities, Временные решения для того, что не поддерживается для подробного обсуждения возможных решений. (Обе ссылки являются кэшированными версиями, потому что оригинальный сайт не работает)

...