Entity Framework - Как получить отфильтрованные основные записи вместе с отфильтрованными записями сведений? - PullRequest
1 голос
/ 18 февраля 2011

Мои классовые отношения: ClassMaster 1 ---- * ClassSessions
Моя цель: вернуть все ClassMasters, у которых ClassSessions с StartDateTime больше текущей даты, вместе с этими 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();

Это дает мне все ClassMasters, которые имеют некоторую ClassSession с StartDateTime> текущей датой, но свойство ClassSessions содержит все ClassSessions, включая более старую, чем текущая дата. Я хочу только ClassSessions с StartDateTime> текущая дата.

Что я делаю не так?

Большое спасибо!

1 Ответ

0 голосов
/ 18 февраля 2011
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; }
}
...