Метод не може бути переведений у вираз магазину


89

Я бачив, як цей код працює з 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.

Хтось може пояснити, чому виникає ця помилка?

Відповіді:


115

Причина: За задумом LINQ to Entities вимагає переведення всього виразу запиту LINQ на серверний запит. Лише кілька некорельованих підвиразів (вирази в запиті, які не залежать від результатів з сервера) обчислюються на клієнті перед перекладом запиту. Викликання довільних методів, які не мають відомого перекладу, як-от GetHomeFeatures (), у цьому випадку не підтримуються.
Якщо бути більш конкретним, LINQ to Entities підтримує лише безпараметричні конструктори та ініціалізатори .

Рішення: Тому, щоб подолати цей виняток, потрібно об’єднати свій підзапит у основний для GetCommunityFeatures () та GetHomeFeatures ()замість безпосереднього виклику методів із запиту LINQ. Крім того, у рядках виникла проблема, з якою ви намагалися створити екземпляр нового екземпляра LazyList, використовуючи його параметризовані конструктори, подібно до того, як ви могли це робити в LINQ to SQL . Для цього рішенням буде перехід до оцінки клієнтами запитів LINQ (LINQ до об’єктів). Для цього потрібно буде викликати метод 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 для сутностей, обхідних шляхів щодо того, що не підтримується, для детального обговорення можливих рішень. (Обидва посилання є кешованими версіями, оскільки вихідний веб-сайт не працює)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.