在Entity Framework查询中使用辅助方法

时间:2014-01-24 08:09:25

标签: c# sql linq entity-framework

使用我们之前的ORM OpenAccess,我们能够在查询的select语句中包含辅助方法。例如,将SQL数据与缓存的应用程序数据组合在一起。

切换到Entity Framework 6.x后,我们遇到如下错误:

  

LINQ-to-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 个答案:

答案 0 :(得分:1)

您不能将自定义方法与查询语法一起使用。您可以看到支持的方法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),
                       ...
                       });