【问题标题】:Query to Include Discriminator value when using TPH使用 TPH 时查询以包含鉴别器值
【发布时间】:2014-11-21 19:10:25
【问题描述】:

当使用 TPH 时,我有不同的类型从基础继承。我们有一个跨抽象类型查询的搜索。在结果中,我们要显示类型:

即。抽象车辆

汽车:车辆 卡车:车辆

在结果中,我想显示“类型” - 即。 “汽车”和“卡车”。

我尝试使用 GetType().Name 但失败了。

这里是示例:

 IQueryable<CompanySearchResult> q = from company in _ctx.Companies
                                                select new CompanySearchResult
                                                {                                                        
                                                    CompanyName = company.CompanyName,
                                                    CompanyId = company.Id,
                                                    Type = company.GetType().Name
                                                };

【问题讨论】:

  • 它不应该失败,这是一个正确的方法。
  • 这是我得到的错误:System.NotSupportedException: LINQ to Entities 无法识别方法 'System.Type GetType()' 方法,并且此方法无法转换为存储表达式。跨度>

标签: c# entity-framework entity-framework-6 discriminator tph


【解决方案1】:

您必须推迟投影,直到内存中有实体

 IEnumerable<CompanySearchResult> q = 
    _ctx.Companies.ToList()
        .Select( company =>
            new CompanySearchResult
            {                                                        
                CompanyName = company.CompanyName,
                CompanyId = company.Id,
                Type = company.GetType().Name
            } );

特别是,这意味着您不应在投影后仍然拥有IQueryable,因为您对内存中的集合进行操作。

【讨论】:

  • 我现在遇到了一个次要问题,我正在对此查询执行排序和分页,并且在发出查询时无法按鉴别器排序
  • 即。 'companySearch.sortBy = companySearch.sortBy ?? “公司名”; query = query.OrderBy(companySearch.sortBy + (companySearch.sortDesc ? " descending" : "")) .Skip((companySearch.page - 1) * companySearch.pageSize) .Take(companySearch.pageSize);
  • 只是想说,他们不允许映射到这个鉴别器字段似乎很短,即使它是“只读的”(尽管这是另一个缺点,你不能改变类型)...所有这些工作都是为了一个相当简单的概念?
  • 好的,我在这里找到了答案:blog.brentmckendrick.com/…
  • 对于那些想知道解决方法的人(不幸的是,MS 没有考虑到这一点)对于我的抽象类型,我创建了一个“类型”字符串属性(可能是一个枚举),然后是每个子类型,将其设置在 ctor 上。然后我使用这个属性来查询,省去了没有这个可用的头痛。它创建“又一个”列来指定此值。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多