Как запросить дочернюю коллекцию во вложенной коллекции с помощью NHibernate? - PullRequest
0 голосов
/ 19 мая 2011

Учитывая следующую структуру:

public class Contract
{
  virtual int Id {get;set;}
  virtual IList<Course> Courses {get;set;}
}

public class Course
{
  virtual int Id {get;set;}
  virtual IList<Schedule> Schedules {get;set;}  
}

public class Schedule
{
  virtual int Id {get;set;}
  virtual DateTime Start {get;set;}
  virtual DateTime End {get;set;}
}

Мне нужно выяснить, имеет ли данный Contract какой-либо Schedule (обратите внимание, как это проходит через отношение Course), совпадающий с любой из моей новой коллекцииSchedule объектов из всех контрактов в базе данных.

Редактировать:

Моя главная проблема - выяснить способ (если это возможно и правдоподобно) сделатьзапрос к коллекции расписаний, а не только к скалярному DateTime.Таким образом, я решил, что не буду делать отдельный запрос для каждого экземпляра расписанияНапример, структура будет выглядеть примерно так:

Contract contract = new  Contract 
{ 
  Courses = new List<Course>() 
  { 
    { 
      new List<Schedule>() 
      { 
        {new Schedule { Start = new DateTime(2011,01,01), End = new 
DateTime(2011,01,31) } }, 
        {new Schedule { Start = new DateTime(2011,02,01), End = new 
DateTime(2011,02,27) } }, 
        {new Schedule { Start = new DateTime(2011,03,01), End = new 
DateTime(2011,03,15) } } 
      } 
    }, 
    { 
      new List<Schedule>() 
      { 
        {new Schedule { Start = new DateTime(2010,12,12), End = new 
DateTime(2010,12,31) } } 
      } 
    } 
  } 
}; 

Как вы думаете, есть ли способ запросить их все сразу?Что лучше сделать цикл foreach для .NET и выполнить индивидуальный запрос?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 мая 2011

Я решил это, пройдя каждый рекурсивно.Я не возражаю против возможности почти N + 1 запросов, потому что мои данные никогда не будут запрашиваться более 5 раз (вершины).Я все еще даю ответ на Ритмис , потому что его HQL дал мне идею использовать Any.

foreach (Course course in contract.Courses)
{
    foreach (Schedule entry in course.Schedules)
    {
        Schedule schedule = entry;
        var query = from  c in Session.Query<Course>()
                    where c.Schedules.Any(x =>
                                              x.Day == schedule.Day &&
                                              (
                                                (x.EndDate < schedule.EndDate && x.StartDate > schedule.StartDate) ||
                                                (x.EndDate == schedule.EndDate && x.StartDate > schedule.StartDate)
                                                // about 10 more of these
                                              )
                                          )
                     select c;

        var conflicting = query.FirstOrDefault();
        if (conflicting != null)
        {
            DoStuff()
        }
    }
}
0 голосов
/ 19 мая 2011

Я не уверен, как это соотносится с LINQ для NHibernate, но версия HQL будет что-то вроде:

FROM Contract cn WHERE EXISTS 
    (FROM cn.Courses cc WHERE EXISTS 
        (FROM cc.Schedules s WHERE s.Start < '2011/01/01'))

Если предположить коллекцию "Контракты", решение LINQ-y будетвероятно, выглядит примерно так:

Contracts.Where(cn => cn.Courses.Any(cc => cc.Schedules.Any(s => s.Start < ...)));

Но я понятия не имею, правильно ли переводчик LINQ переводит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...