使用Table Per Hierarchy继承在LINQ to Entities查询中转换为派生类型

Cha*_*ion 22 .net c# linq linq-to-entities entity-framework

我有一个LINQ to实体模型与Table Per Hierarchy继承.我有一个基类型的查询,我想做特定的类型相关的逻辑.例如:

IQueryable<BaseType> base = ...

// this works fine
var result = base.Select(b => b is DerivedType1 ? 1 : 2).ToList();

// this doesn't compile to SQL
var result2 = base.Select(b => b is DerivedType1 ? ((DerivedType1)b).DerivedProperty : null).ToList();
Run Code Online (Sandbox Code Playgroud)

有没有办法做这样的事情而不分别处理每个派生类型的IQueryables:

// I'd rather not do this:
var resultA = base.OfType<DerivedType1>().Select(d => d.DerivedProperty);
var resultB = base.OfType<DerivedType2>().Select(d => default(int?));
var result = resultA.Concat(resultB).ToList();
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 28

(DerivedType1)bLINQ-to-Entities不支持直接转换为实体类型,但是asoperator(b as DerivedType1)是,因此您可以尝试:

var result2 = base
    .Select(b => b is DerivedType1
        ? (b as DerivedType1).DerivedProperty
        : null)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @ChaseMedallion:可能,是的.我相信我在EF 5之前从未使用过这个,但我不确定.BTW:与此同时,我发现如果`DerivedProperty`可以为空,则不需要三元运算符,你可以使用:`Select(b =>(b as DerivedType1).DerivedProperty)`.如果`b`不是`DerivedType1`类型,EF不会抛出异常,而只是自动返回`null`. (3认同)