合并.net MVC 4模型中的字段而不从LINQ获得“仅支持初始化器,实体成员和实体导航属性”

时间:2012-11-30 01:48:05

标签: linq entity-framework asp.net-mvc-4

这个问题的答案引出了另一个问题: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);

1 个答案:

答案 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可以解析。