【问题标题】:Why Include() not available when Single() is used in entity framework code first fluent api为什么在实体框架代码第一个fluent api中使用Single()时Include()不可用
【发布时间】:2015-03-26 23:53:38
【问题描述】:

我想知道为什么 Include() 不能在 Single() 之后在急切加载中使用。例如,在下面的 sn-p 中,Include 不可用:

db.Teachers.Single(p => p.Id == currUserId)
           .Include(t => t.OfferedCourses)
           .RegisteredCourses
           .ToList();

但是,如果我在 Include() 之后有 Single(),它会起作用:

db.Teachers.Include(t => t.OfferedCourses)
           .Single(p => p.Id == currUserId)               
           .RegisteredCourses
           .ToList();

这样会返回很多不必要的相关数据。以下是我最终得到的方法:

 db.Teachers.Where(p => p.Id == currUserId)
            .Include(t => t.OfferedCourses)
            .First()
            .RegisteredCourses
            .ToList();

这是唯一的解决方案吗?

【问题讨论】:

  • .Include()IQueryable 类型的有效扩展方法。当您指定db.Teachers.Include(db.Teacher.Where( p => p.Id == curreUserId ) 时,您正确地满足了此要求,因为db.Teachersdb.Teachers.Where() 都返回类型IQueryable。您确定您的第二个示例是“过度查询”吗?乍一看,这应该没问题。
  • Single()之后我只得到了Teacher实体的属性,我想Single()把结果转换成一个Teacher实体。
  • 没错——Single() 返回实体类型的单个实例。顺便说一句——你的数据模型在发布的代码中并不明显。看起来您正在查询Teacher,其IdcurrUserId 的值匹配。虽然我可以想象一个用例,其中老师是登录的人(即currUserId),然后您引用RegisteredCourses,这似乎是一个学生属性——但我再次可以想象Teacher 具有RegisteredCourses 的结构.您可以使用伪代码或英语来描述您尝试使用此查询检索的内容吗?

标签: asp.net entity-framework eager-loading ef-fluent-api


【解决方案1】:

以下是帖子标题对您问题的回答:

为什么在实体框架代码先fluent api中使用Single()时Include()不可用

.Include() 是 Linq-To-Entities 中的扩展方法,需要类型 IQueryable

当您指定db.Teachers.Include()db.Teacher.Where().Include() 时,您满足此要求,因为db.Teachersdb.Teachers.Where() 返回类型IQueryable

但是当您指定 db.Teachers.Single() 时,返回类型 Teacher 将不适用于 Include()

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2011-06-29
    相关资源
    最近更新 更多