如何选择组织及其下一个活动?

时间:2016-01-11 23:22:23

标签: c# sql-server entity-framework

我的SQL Server数据库organisationevent中有两个表。

一个组织有多个活动。每个活动都有自己的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。

更新

我忘了提到我试图在下次活动的日期只选择一次该组织的名称。每个组织应该只有下一个即将举行的活动。

更新#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 :(得分: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之后开始的第一个事件。

请注意,对于没有即将举办的活动的组织,UpcommingEventnull

以下是使用查询语法完成相同查询的方法:

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()

    };