【问题标题】:Coalesce fields in a .net MVC 4 model without getting "Only initializers, entity members, and entity navigation properties are supported" from LINQ合并 .net MVC 4 模型中的字段,而不从 LINQ 获得“仅支持初始化程序、实体成员和实体导航属性”
【发布时间】:2012-12-01 01:29:25
【问题描述】:

这个问题的答案引发了另一个问题: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 语句显然会起作用,但是有几十个位置需要存在此逻辑,并且最好将此逻辑保留在一个位置以备不时之需。

以下代码是我尝试将合并存储在模型中,但这会导致“仅支持初始化程序、实体成员和实体导航属性。”在 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);

【问题讨论】:

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


    【解决方案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 可以对其进行解析。

    【讨论】:

    • 我已经搞砸了这种方法,但无法弄清楚如何使用查询样式的 LINQ 语句,使用对象样式的 LINQ 语句,因为在您的示例中是缺失的部分。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2020-08-15
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多