【发布时间】:2016-06-28 03:54:56
【问题描述】:
使用实体框架,我有一个类层次结构,它们映射到同一个表。类似Cat : Animal、Dog : Animal、Goat : Animal。
当然,EF 在内部使用 Discriminator 列来处理它们。
现在,我想写这样的东西:
var houseAnimals = new List<Type>(new [] { typeof(Cat), typeof(Dog) });
this.dataRepository.Animals.Where(a => houseAnimals.Contains(a.GetType()));
这当然行不通,因为 LINQ-to-SQL 不支持.GetType()。但是,这会起作用:
this.dataRepository.Animals.Where(a => a is Cat);
我不想做a is Cat || a is Dog,因为这个列表是在运行时动态构建的。
基于this post,我了解EF 会将其转换为具有“鉴别器”语句的SQL 查询。所以,这给了我一些希望,我需要做的事情。这个:
this.dataRepository.Animals.Where(a => a is **in** houseAnimals);
会很好,但当然没有这样的语法。
问题是,我可以使用什么语法来实现这一点?我在这里错过了什么吗?这是 EF 中缺少的功能吗?我不可能是唯一一个想做这样查询的人。
请不要根据这个示例对我的方法和执行此查询的需要进行解释,因为我已经简化了很多只是为了解释我需要什么。做.ToList() 也不是一种选择。
【问题讨论】:
-
如果我是你,我会非常厌倦 Discriminator 列,只有在你真的需要时才使用它们。 SQL 有关系——主键和外键——尝试使用这种继承映射可能会给你带来各种各样的问题
-
我没有明确地使用鉴别器列。
-
好的,让我换个说法 - 我会非常厌倦在 SQL 中使用 C# 对象继承映射。
-
这是 EF 代码首先工作的默认方式。包管理器控制台为我生成 SQL 脚本,它决定为我的类 + 鉴别器使用单个表。我没有资格批评它;)
标签: c# entity-framework