2013-03-26 96 views
0

当通过实体框架访问数据库我有三个可用的实体:LINQ:过滤子对象

  • 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都有INT作为它们的ID类型,还需要以下内容:

stt_change_log.element_type_id = (7 | 8 | 9) 

现在,当我运行下面的查询语句时,它会返回所有具有指定ID的stt_change_log实体,这意味着如果我想在stt_dictionary.id = 1时需要stt_change_log实体,则还会获得stt_change_log条目,这些条目属于stt_concept和stt_term实体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实体?

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

回答

1

不幸的是,包括不允许过滤。

您可以use a projection执行筛选服务器大小,或者您可以根据需要延迟加载项目。

您也可以vote for that feature未来包括在内。

+0

感谢您的快速响应,埃里克。我其实并不需要第一个。包括声明,因为该级别的儿童由一个协会填充。但是,即使stt_change_log和stt_change_types之间存在关联,stt_change_log也是如此。stt_change_type属性不会自动填充(我不知道为什么)。 因此,因为.Include语句仅用于下一级(不是我想要筛选的级别),所以这对我有利吗?这是否意味着*有*我可以在stt_change_log集合上做的事情? – awj 2013-03-26 17:39:05

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

+0

TPH继承确实看起来正是我所需要的。但花了大约3个小时后,我无法实现它 - 太多的构建错误。我在你的第一个链接(我没有使用Code First)中跟着这个例子,但是在这个例子中使用的模型和我的模型之间的区别在于我的联系更多。具体来说,它告诉我标记为抽象(和继承)的实体上存在关联,并且一旦从stt_change_log实体继承了新实体,那些关联就不再有效。可惜,TPH看起来非常有用。 – awj 2013-03-27 10:42:06