实体框架 - 如何获取筛选的主记录以及筛选的详细记录?

时间:2011-02-18 15:43:58

标签: entity-framework master-detail

我的班级关系:ClassMaster 1 ---- * ClassSessions
我的目标:返回所有具有StartDateTime大于当前日期的ClassSession的ClassMaster,以及这些ClassSessions(按日期过滤)。

在T-SQL中我会这样做:

select *
   from ClassSession
   join ClassMaster on ClassMaster.ClassId = ClassSession.ClassId
   Where ClassSession.StartDateTime > getdate()

我需要在Entity Framework 4查询中实现相同的结果。这是我认为它会起作用的,但不是:

   var classes = ctx.ClassSessions
                 .Include("ClassMasters")
                 .Where(s => s.StartDateTime > DateTime.Now)
                 .Select(s => s.ClassMaster)
                 .ToList();

这给了我所有带有StartDateTime>的ClassSession的ClassMaster;当前日期,但ClassSessions属性充满了所有 ClassSessions,包括早于当前日期。我只想要使用StartDateTime>的ClassSessions;当前日期。

我做错了什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

var masters = ctx.ClassMasters
         .Where(cm => cm.ClassSessions.Any(cs => cs.StartDateTime > DateTime.Now))
         .Select(cm => new { ClassMaster = cm, ClassSessions = cm.ClassSessions.Where(cs => cs.StartDateTime > DateTime.Now)
         .ToList().Select(e => e.ClassMaster);

如果您在上下文中的某处加载了所有ClassSession对象,您仍然可以执行此操作:

var masters = ctx.ClassMasters
         .Where(cm => cm.ClassSessions.Any(cs => cs.StartDateTime > DateTime.Now))
         .Select(cm => new ClassMasterWithSessionModel{ ClassMaster = cm, ClassSessions = cm.ClassSessions.Where(cs => cs.StartDateTime > DateTime.Now)
         .ToList();

public class ClassMasterWithSessionModel {
    ClassMaster ClassMaste { get; set; }
    IEnumerable<ClassSession> ClassSessions { get; set; }
}