2014-01-24 5 views
1

Используя наш предыдущий ORM, OpenAccess, мы могли включать вспомогательные методы в операторы выбора наших запросов. Например, чтобы объединить данные SQL с данными кэшированных приложений.Использование вспомогательных методов в запросе Entity Framework

После перехода на Entity Framework 6.x мы получаем ошибки, как это:

LINQ к Entities не распознает метод 'System.String GetProductTranslation'

Линг запрос выглядит следующим образом:

var products = (from p in db.Products 
       join cp in db.CustomerPrices on p.ProductId equals cp.ProductId 

       where p.LockedSince.Equals(null) 
       && ... etc etc etc 

       select new 
       { 
        ProductId = p.ProductId, 
        Name = TranslationHelper.GetProductTranslation(p.ProductId, ProductTranslationField.Name, p.Name), 
        Description2 = TranslationHelper.GetProductTranslation(p.ProductId, ProductTranslationField.Description2, p.Description2), 
        Description3 = TranslationHelper.GetProductTranslation(p.ProductId, ProductTranslationField.Description3, p.Description3), 
        Description4 = TranslationHelper.GetProductTranslation(p.ProductId, ProductTranslationField.Description4, p.Description4), 
        ... etc etc etc 
       }); 

в этом случае метод GetProductTranslation захватывает данные трансляции из кэша приложений для предотвратить использование бесконечных количеств объединений и подчеркнуть базу данных.

Каким будет лучший способ реплицировать это с помощью Entity Framework 6.x?

+1

Почему просто не расколоть путем SQL запроса, который будет возвращать ненужные данные продукта и другие методы для извлечения того, что вы хотите от кеша? –

ответ

1

Вы не можете использовать пользовательские методы с запросом syntax.You можно увидеть поддерживаемые методы here

Вместо этого вы должны использовать Extension methods так:

db.Products.Join(db.CustomerPrices, 
       p => p.ProductId, 
       c => c.ProductId, 
       (p,c) => new { Product = p, cust = c }) 
      .Where(p => p.Product.LockedSince.Equals(null)) 
      .Select(p => new { 
         ProductId = p.Product.ProducId, 
         Name = TranslationHelper.GetProductTranslation(p.Product.ProductId, ProductTranslationField.Name, p.Product.Name), 
         ... 
         }); 
+0

Я не уверен, что делать с вашим примером кода. Все, что я вижу, это использование синтаксиса лямбда. Переход к другому синтаксису не повлиял на исключение, которое выбрано EF. На данный момент я разделил двух, как предложил Владимир Шмидт выше. Но я все равно был бы рад видеть эти два интегрированных, как у нас раньше. – Erik

+0

@Erik, ваш запрос преобразует этот синтаксис лямбда за кулисами, но существует ограничение в synxtax запроса. Вы не можете использовать неподдерживаемые методы, когда вы пытаетесь использовать неподдерживаемый метод в синтаксисе запроса, он не распознается, потому что нет сопоставление для этого метода. Используя прямой синтаксис лямбда, вы можете использовать все, что хотите –

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