这个问题的答案引出了另一个问题:How to use LINQ expressions as static members of classes in queries when the class is related multiple times to a second class
我有一个现有的ASP.net MVC 4网站,我需要修改。
此网站中的核心实体是待售商品,由几家不同的公司创建并分为几个类别。我的任务是允许每个公司为全局类别提供自己的可选别名。获取在数据库和模型中设置的两个类别没有问题,使应用程序在存在时使用新的可选别名,而默认为全局,否则就是我在努力寻找最佳方法的地方。
为每个LINQ查询添加一个coalesce语句显然会有效,但是有几十个位置需要存在这个逻辑,并且最好将这个逻辑保存在一个地方,以便在不可避免的变化发生时。
以下代码是我尝试将coalesce存储在模型中,但这会导致LINQ时抛出“仅初始值设定项,实体成员和实体导航属性。”错误查询已执行。我不确定如何使用更符合LINQ的不同方法实现类似的功能。
型号:
public class Item
{
[StringLength(10)]
[Key]
public String ItemId { get; set; }
public String CompanyId { get; set; }
public Int32 CategoryId { get; set; }
[ForeignKey("CategoryId")]
public virtual GlobalCategory GlobalCategory { get; set; }
[ForeignKey("CompanyId, CategoryId")]
public virtual CompanyCategory CompanyCategory { get; set; }
public String PreferredCategoryName
{
get{
return (CompanyCategory.CategoryAlias == null || CompanyCategory.CategoryAlias == "") ? GlobalCategory.CategoryName : CompanyCategory.CategoryAlias;
}
}
}
控制器LINQ示例:
var categories = (from i in db.Items
where i.CompanyId == siteCompanyId
orderby i.PreferredCategoryName
select i.PreferredCategoryName).Distinct();
var itemsInCategory = (from i in db.Items
where i.CompanyId == siteCompanyId
&& i.PreferredCategoryName == categoryName
select i);
答案 0 :(得分:1)
对于您在查询中使用已编译函数(getPreferredCategoryName
)的人,除非EF知道如何翻译您遇到麻烦。
在项目定义中尝试以下内容:
public static Expression<Func<Item,String>> PreferredCategoryName
{
get
{
return i => (i.CompanyCategory.CategoryAlias == null || i.CompanyCategory.CategoryAlias == "") ?
i.GlobalCategory.CategoryName :
i.CompanyCategory.CategoryAlias;
}
}
使用如下:
var categories = db.Items.Where(i => i.CompanyID == siteCompanyId)
.OrderBy(Item.PreferredCategoryName)
.Select(Item.PreferredCategoryName)
.Distinct();
这应该有效,因为你有一个通常可用的未编译的表达式树,然后EF可以解析。