1

这个问题的答案引发了另一个问题:当类与第二个类多次相关时,如何在查询中使用 LINQ 表达式作为类的静态成员

我有一个需要修改的现有 ASP.net MVC 4 站点。

本网站的核心实体是待售商品,由多家不同的公司创建并分为多个类别。我的任务是让每家公司都有自己的全局类别可选别名。在数据库和模型中设置这两个类别没有问题,使应用程序在存在时使用新的可选别名并默认为全局,否则我正在努力寻找最佳方法。

向每个 LINQ 查询添加一个合并语句显然会起作用,但是有几十个位置需要存在此逻辑,并且最好将此逻辑保留在一个位置以备不时之需。

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

1 回答 1

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

于 2012-11-30T12:11:42.693 回答