我的班级关系: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;当前日期。
我做错了什么?
非常感谢!
答案 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; }
}