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

C# SQL到实体-复杂查询选择日期,c#,entity-framework,linq,C#,Entity Framework,Linq,我首先使用实体框架代码,我想查询数据库中的约会表,选择: 指定日期的所有约会 public IEnumerable<Appointment> GetAppointments(IEnumerable<DateTime> datesWithEverything) { using (OneClickContext context = new OneClickContext()) { var query = from e in context.Ap

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

  • 指定日期的所有约会

    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;
        }
    }
    
    public IEnumerable GetAppointment(IEnumerable日期和所有内容)
    {
    使用(OneClickContext=newOneClickContext())
    {
    var query=来自context.AppointmentSet中的e
    where dates包含所有内容(例如StartDate)
    选择e;
    返回查询;
    }
    }
    
  • 我还需要从其他任何一天开始只进行一次约会,第一次约会是在给定日期之外的每一天找到的

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

    这是否可能一次命中数据库


    非常感谢您的帮助。

    如果我正确理解您的需求,您将获得一系列日期的所有约会数据,然后您只需知道至少有一个约会的所有其他日期,即可将其加粗。实际上,您还没有在其他日期使用约会数据。对吗

    您尝试限制访问数据库的次数是正确的,但是您需要平衡这一点,同时不返回超出实际需要的数据。如果我理解正确,您需要的只是约会日期,您应该使用第二个查询:

    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();
        }
    }
    
    请注意
    ToList()
    。Linq查询执行被推迟到第一次枚举它,并且在using块中声明查询上下文时。在这种情况下,必须在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();
        }
    }
    
    public IEnumerable GetAppointment(IEnumerable日期和所有内容)
    {
    使用(OneClickContext=newOneClickContext())
    {
    var query=来自context.AppointmentSet中的e
    where dates包含所有内容(例如StartDate)
    选择e;
    query=query.Union(来自context.AppointmentSet中的e)
    按DbFunctions.TruncateTime(e.StartDate)将e分组到grp中
    选择grp.FirstOrDefault());
    返回query.ToList();
    }
    }
    
    如果您确实需要其他日期的约会数据,请共享示例数据和表格结构。如果我得到了日期,我需要创建假约会来绑定它们(MVVM)。我想知道我是否可以用一次数据库访问来完成。谢谢迪米特里抽出时间。不幸的是,因为我使用的是SQLite数据库,所以不支持应用连接。
    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();
        }
    }