0

通过实体框架访问数据库时,我有三个可用的实体:

  • stt_dictionary
  • stt_concept
  • stt_term

这些实体中的每一个都具有第四个实体 stt_change_log 的集合。

例如,

stt_dictionary.stt_change_log = ICollection<stt_change_log>

前 3 个元素与 stt_change_log 之间的关系是

stt_change_log.element_id = (stt_dictionary | stt_concept | stt_term).id;

但是,由于 stt_dictionary、stt_concept 和 stt_term 的 ID 类型均为int,因此还需要以下内容:

stt_change_log.element_type_id = (7 | 8 | 9)

现在,当我运行如下查询时,它返回具有指定 ID 的所有 stt_change_log 实体,这意味着如果我在 stt_dictionary.id = 1 时想要 stt_change_log 实体,我还会获得与 stt_concept 和 stt_term 实体相关的 stt_change_log 条目,其 ID 也= 1。换句话说,stt_change_log 集合需要额外的过滤。

var daoDictionary = (from d in db.stt_dictionary
                         .Include("stt_change_log.stt_change_types")
                     where d.id == id
                     select d).FirstOrDefault();

如何通过为 stt_change_log 集合中的每个项目指定 element_type_id 属性的值来过滤 stt_change_log 实体?

我还要补充一点,我的意图是在单个查询中执行此操作。

4

2 回答 2

1

您最好的选择是为您的日志实体使用逐层表 (TBH) 继承映射。您将定义一个基本实体 stt_change_log,然后为每种类型的日志派生一个实体类。stt_change_type 将是鉴别器。

然后,您的每个“主要”实体都会引用特定于该实体的日志类型,并且过滤会神奇地为您完成;)

阅读以下教程以开始使用:

http://msdn.microsoft.com/en-us/data/jj618292

请注意,在您的情况下,您不需要派生实体中的任何其他属性。如果您先使用代码,请先搜索“按层次结构代码表”;这是一个快速准备:http: //blogs.msdn.com/b/wriju/archive/2011/05/17/code-first-ef-4-1-table-per-hierarchy.aspx

于 2013-03-26T18:07:40.237 回答
1

不幸的是 .Include 不允许过滤。

您可以使用投影来执行过滤服务器大小,也可以根据需要延迟加载项目。

您还可以投票支持该功能在未来包含。

于 2013-03-26T17:31:58.963 回答