如何选择日期范围?

时间:2019-07-18 15:52:36

标签: c# entity-framework

我有一个像这样的表

public class Record {
  public int Id { get; set; }
  public DateTime Date { get; set; }
  public DateTime StartTime { get; set; }
  public DateTime EndTime { get; set; }
}

我想得到类似的东西:

[{
    "Date": "StartDate",
    "Records": []
}, {
    "Date": "StartDate+1Day",
    "Records": []
}, {
    "Date": "StartDate+2Day",
    "Records": []
}, {
    "Date": "EndDate",
    "Records": []
}]

StartDateEndDate将被传递给控制器​​。 对于没有任何记录的日期,Records可以为null。使用实体框架有可能获得类似的东西吗?

问题被标记为重复,但我认为不是。目前,我正在这样做以获得我期望的结果:

     var dates = new List<DateTime>();
     for (var date = startDate; date <= endDate; date = date.AddDays(1)) {
        dates.Add(date);
     }

     var report = new List<object>();
     foreach (DateTime date in dates) {
        var item = new {
           Date = date,
           Records = db.Records
           .Where(r => r.Date >= date && r.Date <= date)
           .Select(r => new {
              r.StartTime,
              r.EndTime
           }).ToList()
        };
        report.Add(item);
     }

但是我认为这不是获得预期结果的好方法。我只是不知道是否有更有效的方法来获得此结果。

2 个答案:

答案 0 :(得分:0)

您可以使用DateTime检查.Date天是否相等:

DateTime d1 = new DateTime(2019, 7, 18, 12, 5, 2);
DateTime d2 = new DateTime(2019, 7, 18, 5, 45, 33);
d1.Date == d2.Date

对于所需的数据结构,可以创建一个具有相应属性的新类:

public class RecordData
{
    public string Date { get; set; }
    public List<Record> Records { get; set; }
}

然后,开始将RecordData个对象添加到列表中:

List<RecordData> RecordDatas = new List<RecordData>();

使用与此类似的LINQ语句(假设我们有名为records的EF记录列表和名为startDate的开始日期):

RecordDatas.Add(new RecordData
{
    Date: "StartDate",
    Records: records.Where(r => r.Date.Date == startDate.Date).ToList();
}

最后,使用库(例如Newtonsoft Json.NET)将RecordData列表序列化为JSON:

string output = JsonConvert.SerializeObject(RecordDatas);

答案 1 :(得分:0)

尝试以下操作:

   public class Record
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }

        public List<List<Record>> GroupRecords(List<Record> data, DateTime start, DateTime end)
        {
            return data
                .Where(x => (x.Date > start) && (x.Date < end)) 
                .GroupBy(x => x.Date.Date).Select(y => y.ToList()).ToList();

        }
    }