2016-01-11 1 views
0

У меня есть две таблицы в моей базе данных SQL Server, organisation и event.Как выбрать организацию и следующее мероприятие?

Одна организация имеет несколько событий. Каждое событие имеет свой собственный date.

Я пытаюсь получить следующую/предстоящую дату события с ее организацией name. Следующее событие - это то, где дата событий равна сегодня или дням.

Я пытался что-то вроде этого (который, очевидно, не работает):

var queryResults = (from o in context.Organisations 
      join e in context.Events on o.Id equals e.Organisation.Id 
      where e.PremiereDateTime >= DateTime.UtcNow 
      orderby e.PremiereDateTime ascending 
      select o, e); 

Я пытался сделать group by, но мне не удалось. Я работал с простым T-SQL-запросом, но хочу сделать это с помощью Entity Framework.

UPDATE

Я забыл упомянуть, что я пытаюсь выбрать название организации только один раз с датой следующего события. Каждая организация должна иметь только следующее предстоящее мероприятие.

ОБНОВЛЕНИЕ # 2

Желаемый выход:

  • organisation1 следующее событие: date3
  • organisation2 следующее событие: date4

ОБНОВЛЕНИЕ # 3

Это то, что я прямо сейчас:

var result = from org in context.Organisations 
      join sorg in context.SubOrganisations on org.Id equals sorg.Organisation.Id into sorg2 
      from s in sorg2.DefaultIfEmpty() 
      join ev in context.Events on s.Id equals ev.SubOrganisation.Id into ev2 
      from e in ev2.DefaultIfEmpty() 
      select new 
       { 
        Name = org.Name, 
        UpcomingEvent = (from ee in s.Events 
            where ee.PremiereDateTime >= DateTime.UtcNow 
            orderby ee.PremiereDateTime ascending 
            select ee).FirstOrDefault() 
       }; 
+1

Вам нужно будет выбрать анонимный тип, если вы хотите, как данные организации и событий в том же объекте –

+0

У вас есть навигационный свойство '.Events' на' Organisation'? –

+0

@YacoubMassad Да, я знаю. –

ответ

1

Вы можете сделать что-то вроде этого:

var result = 
    context 
    .Organisations 
    .Select(org => 
     new 
     { 
      Name = org.Name, //Assuming that you have a `Name` property on Organisation 
      UpcommingEvent = 
       org.Events 
       .Where(e => e.PremiereDateTime >= DateTime.UtcNow) 
       .OrderBy(e => e.PremiereDateTime) 
       .FirstOrDefault() 
     }) 
    .ToList(); 

Это начинается от организаций. Для каждого из них он выбирает свое имя и первое событие, которое начинается после DateTime.UtcNow.

Внимание: UpcommingEvent будет null для организаций, не имеющих запланированных событий.

Вот как тот же запрос можно сделать с помощью синтаксиса запросов:

var result = 
    from org in context.Organisations 
    select new 
    { 
     Name = org.Name, 
     UpcommingEvent = (from e in org.Events 
      where e.PremiereDateTime >= DateTime.UtcNow 
      orderby e.PremiereDateTime ascending 
      select e).FirstOrDefault() 

    }; 
+0

Спасибо. Не могли бы вы сделать это в синтаксисе запроса, если его не так много спросить? –

+0

@JoSmo, см. Мое обновление –

+0

Awesome. Спасибо. Позвольте мне попробовать. :) –