SQL到实体 - 复杂查询选择日期

时间:2017-01-15 16:58:27

标签: c# entity-framework linq

我正在使用实体框架代码优先,我想在我的数据库中查询约会表选择:

  1. 指定日期的所有约会

    public IEnumerable<Appointment> GetAppointments(IEnumerable<DateTime> datesWithEverything)
    {
        using (OneClickContext context = new OneClickContext())
        {
            var query = from e in context.AppointmentSet
                        where datesWithEverything.Contains(e.StartDate)
                        select e;
            return query;
        }
    }
    
  2. 我还需要任何一天的约会,这是每天未发现的第一次约会。

  3. 原因是,我的日历组件将能够以粗体显示包含至少一个约会的日期,但我不想加载数千个约会,因为我将会看几天(所有的细节)每个请求。

    这可能会一次击中数据库吗?

    感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果我正确了解您的需求,您将获得一系列日期的所有约会数据,然后您只需要知道至少有一个约会的所有其他日期以加粗它们。您还没有在其他日期实际使用约会数据。这是对的吗?

您尝试限制到数据库的次数是正确的,但您需要在不返回实际需要的数据的情况下进行平衡。如果我理解正确,您需要的是约会日期,您应该使用第二个查询:

public IEnumerable<DateTime> GetDatesWithAppointments()
{
    using (OneClickContext context = new OneClickContext())
    {
        var query = (from e in context.AppointmentSet
                    order by e.StartDate
                    select e.StartDate).Distinct();
        return query.ToList();
    }
}

此外,这是一个风格问题,但变量&#34;查询&#34;不需要,你可以简单地说:

return (from e in context.AppointmentSet
        order by e.StartDate
        select e.StartDate).Distinct().ToList();

请注意ToList()。 Linq查询执行被推迟到第一次枚举并且您的查询上下文在using块中声明。在这种情况下,您必须在使用块退出之前执行查询。

在编辑时,由于您需要实际预约,您应该能够使用linq的联合和分组在一次旅行中获得您想要的内容。 Union将自动删除任何重复的条目。

public IEnumerable<Appointment> GetAppointments(IEnumerable<DateTime> datesWithEverything)
{
    using (OneClickContext context = new OneClickContext())
    {
        var query = from e in context.AppointmentSet
                    where datesWithEverything.Contains(e.StartDate)
                    select e;

        query = query.Union(from e in context.AppointmentSet
                           group e by DbFunctions.TruncateTime(e.StartDate) into grp
                           select grp.FirstOrDefault());

        return query.ToList();
    }
}