【发布时间】:2013-09-19 10:08:03
【问题描述】:
我正在使用带有 Code First 的 EntityFramework 5。
请看下面的POCO。
public class Product
{
[Key]
public Guid Id { get; set; }
public string Name {get; set; } // e.g. en=Screwdriver;de=Schraubenzieher;fr=Tournevis
/// <summary>
/// This will always return a valid string.
/// </summary>
/// <param name="languageCode"></param>
/// <returns></returns>
public string GetLocalizedName(string languageCode)
{
...
}
}
如您所见,每个产品都有一个“多语言”名称,其中包含该字符串中的所有不同翻译。
我想不出一种简单的方法来使用 LINQ 按某种语言对产品进行排序。我正在寻找的代码应该是这样的(假设我想要一个基于英文名称的排序集合):
var sortedProducts = from p in Context.Products
orderby p.GetLocalizedName("en")
select p;
但是,一旦我遍历项目,这将不起作用,例如with .ToList(): “LINQ to Entities 无法识别方法 'System.String GetLocalizedName(System.String)' 方法,并且该方法无法转换为存储表达式。”
有人对如何解决这个问题有一个优雅的想法吗?结果必须再次是 Product 类型的 IQueryable(如果没有其他方法我也可以使用产品列表)。
谢谢大家!
【问题讨论】:
-
您不能直接在 Linq2Entity 中使用您的 .NET 方法。可以分享
GetLocalizedName的代码吗? -
老实说,我认为这是绕过本地化的错误方法。我认为您应该有一个翻译表,其中包含
prodScrewDriver,以及各种文化的映射。然后,您的Name方法仅返回prodScrewDriver并且接口会对其进行适当的翻译。 -
产品名称始终包含所有可用语言?
-
谢谢大家。是的,当然,使用单独的语言表是正常的做法。但在这种情况下,我没有这个选项。这就是为什么我必须想出这个多语言字符串。没想到你会比我的查询问题更关心这个;-)
标签: c# linq entity-framework