使用我们之前的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复制此内容的最佳方法是什么?
答案 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),
...
});