【问题标题】:LINQ: filter child objectsLINQ:过滤子对象
【发布时间】:2013-03-27 02:07:40
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    很遗憾。Include 不允许过滤。

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

    你也可以vote for that feature以后加入。

    【讨论】:

    • 感谢您的快速回复,埃里克。我实际上并不需要第一个 .Include 语句,因为该级别的子级由关联填充。但是,即使 stt_change_log 和 stt_change_types 之间存在关联,stt_change_log.stt_change_type 属性也不会自动填充(我不知道为什么)。所以,由于 .Include 语句只存在于下一个级别(不是我想要过滤的级别),这对我有利吗?这是否意味着 我可以在 stt_change_log 集合上做些什么?
    【解决方案2】:

    您最好的选择是为您的日志实体使用逐层表 (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

    【讨论】:

    • TPH 继承确实看起来正是我所需要的。但是在花了大约 3 个小时之后,我就是无法让它工作 - 太多的构建错误。我在您的第一个链接中遵循了示例(我没有使用 Code First),但是示例中使用的模型与我的模型之间的区别在于我的关联要多得多。具体来说,它告诉我将实体上的关联标记为抽象(并继承自),一旦我从 stt_change_log 实体继承了新实体,这些关联就不再有效。很遗憾,因为 TPH 看起来很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多