如何在Entity Framework实体容器中查询派生实体类的对象?

Iva*_*van 3 c# linq-to-entities entity-framework visual-studio

我的数据模型中有一个复杂的继承结构.我的模型中的大多数类(在VS 2010中设计,之后由其生成的DB)来自3个基本类.在上下文成员中只能找到这3个类.我如何使用所有派生类?

Cra*_*ntz 10

罗杰的答案有点作品,但可能不会给你想要的结果.通常使用起来更好OfType().要使用他的例子:

var horses = from animal in ctx.AnimalSet
             where animal is Horse
             select animal as Horse;
Run Code Online (Sandbox Code Playgroud)

这种horses类型IQueryable<Animal>.但在这种情况下你可能想要IQueryable<Horse>,你可以得到:

var horses = from animal in ctx.AnimalSet.OfType<Horse>()
             select animal;
Run Code Online (Sandbox Code Playgroud)

... 要不就:

var horses = ctx.AnimalSet.OfType<Horse>();
Run Code Online (Sandbox Code Playgroud)

同样,Roger的第二个查询可以重写为:

var horses = from horse in ctx.AnimalSet.OfType<Horse>()
             where horse.TracksWon > 3
             select horse;
Run Code Online (Sandbox Code Playgroud)

哪个更容易阅读,但将结果类型更改为IQueryable<Horse>.


Rog*_*son 6

您可以像这样查询子类型:

  var horses = from animal in ctx.AnimalSet
               where animal is Horse
               select animal as Horse;
Run Code Online (Sandbox Code Playgroud)

这将从我的考试上下文中的Animal集中获取所有Horse对象.

如果您希望查询子类型特定属性,您可以执行以下操作:

var horses = from animal in ctx.AnimalSet
             where animal is Horse //edit, this line is not needed
             let horse = animal as Horse
             where horse.TracksWon > 3
             select horse;
Run Code Online (Sandbox Code Playgroud)

这将全部转换为SQL,因此没有像获取所有动物和在客户端过滤的开销,它可以正常工作.

HTH