我正在使用实体框架代码优先,我想在我的数据库中查询约会表选择:
指定日期的所有约会
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;
}
}
我还需要任何一天的约会,这是每天未发现的第一次约会。
原因是,我的日历组件将能够以粗体显示包含至少一个约会的日期,但我不想加载数千个约会,因为我将会看几天(所有的细节)每个请求。
这可能会一次击中数据库吗?
感谢任何帮助。
答案 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();
}
}