LINQ:过滤子对象

时间:2013-03-26 17:27:45

标签: c# linq entity-framework entity-framework-5

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

  • stt_dictionary
  • stt_concept
  • stt_term

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

例如,

stt_dictionary.stt_change_log = ICollection<stt_change_log>

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

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

但是,由于stt_dictionary,stt_concept和stt_term都将 int 作为其ID类型,因此还需要以下内容:

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实体?

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

2 个答案:

答案 0 :(得分:1)

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

您可以use a projection执行过滤服务器大小,也可以根据需要延迟加载项目。

您还可以将vote for that feature包括在内。

答案 1 :(得分: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