【问题标题】:C# Linq Where Date Between 2 DatesC# Linq 两个日期之间的日期
【发布时间】:2020-02-25 23:15:14
【问题描述】:

我正在尝试获取我的 linq 语句以获取两个日期之间的所有记录,但我不太确定需要更改哪些内容才能使其正常工作:(a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

【问题讨论】:

标签: c# linq


【解决方案1】:

改成

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)

【讨论】:

  • 嗨@Giorgi:LINQ to Entities 不支持指定的类型成员“日期”。
  • 嗨@admin 解决方案是不要在表的属性中指定函数 Date 。例如:db.Invoices.Where(w=>w.Date >= Date1.Date && w.Date
  • @user1502624 这在 EF 主线中不起作用,我已经看到了源代码。我做了一个可以工作的分支。它通过将.Date 调用转换为EntityFunctions.TruncateDate 调用来工作。
  • 此查询将忽略在开始日期之前开始并在结束日期之后结束的约会;应包括的多日约会。如果您需要包含此类可能性的查询,请查看@Enigmativity 的stackoverflow.com/a/7815706/4040647 此处的“第二个查询”
  • 相比之下,DateTime.Date 无法转换为 SQL。要获取日期部分,可以使用DbFunctions.TruncateTime (docs.microsoft.com/en-us/dotnet/api/…)。
【解决方案2】:
var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID
                        where a.Start.Date >= startDate.Date
                        where a.Start.Date <= endDate.Date

【讨论】:

    【解决方案3】:
    var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();
    

    【讨论】:

      【解决方案4】:

      所以你向下滚动是因为答案不起作用:

      这很神奇(但他们说它对大数据有效率问题,而且你和我一样不在乎)

      1- 就我而言,数据库中的数据类型是“日期时间”和“可空”。

      DB 中的示例数据格式如下:

      2018-11-06 15:33:43.640
      

      在 C# 中转换为字符串时是这样的:

      2019-01-03 4:45:16 PM
      

      所以格式是:

      yyyy/MM/dd hh:mm:ss tt
      

      2- 所以你需要首先以正确的格式准备你的日期时间变量:

      示例 1

      yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")
      

      示例 2 - 过去 30 天的日期时间范围

          DateTime dateStart = DateTime.Now.AddDays(-30);
          DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);
      

      3- 最后是您浪费一天时间寻找的 linq 查询(需要 EF 6)

      using System.Data.Entity;
      
      _dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();
      

      还要考虑时间比较:

      (DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)
      

      注意其他stackoverflow问题和答案中提到的以下方法将无法正常工作:

      ....
      &&
      (
          s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
          s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
          s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
      )).count();
      

      如果开始日在本月,结束日在下个月,则查询将返回 false 且无结果,例如:

      DatabaseCreatedAtItemThatWeWant = 2018/12/05

      开始日期 = 2018/12/01

      结束日期 = 2019/01/04

      查询将始终搜索 01 和 04 之间的天而不考虑“月份”,因此“s.Created_at.Value.Day

      如果你有非常大的数据,你会执行 Native SQL Query 而不是 linq

      ...
          ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
          ....
      

      谢谢

      【讨论】:

      • 在日期范围内仍然没有得到正确的项目。
      【解决方案5】:

      如果有人有兴趣知道如何使用 2 个列表和日期之间的工作

      var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))
      

      【讨论】:

        【解决方案6】:

        如果您有日期间隔过滤条件,并且您需要选择部分属于此过滤范围的所有记录。假设:records 有 ValidFrom 和 ValidTo 属性。

        DateTime intervalDateFrom = new DateTime(1990, 01, 01);
        DateTime intervalDateTo = new DateTime(2000, 01, 01);
        
        var itemsFiltered = allItems.Where(x=> 
            (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
            (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
            (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
            (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
        );
        

        【讨论】:

          【解决方案7】:

           public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
                  {
                      List<tbltask> tbtask = new List<tbltask>();
                      DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
                      DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
                      tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
                          Where(x => x.tblproject.company_id == c
                              && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                              && (statusid == 0 || statusid == x.tblstatu.StatusId)
                              && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                              && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();
          
          
          
                      return tbtask;
          
          
                  }

          这是我对基于 searchdata 和开始到结束日期之间的搜索记录的查询

          【讨论】:

            【解决方案8】:

            我在让它工作时遇到了问题。

            我在 db 行中有两个日期,我需要将它们添加到昨天、今天和明天的列表中。

            这是我的解决方案:

                    var yesterday = DateTime.Today.AddDays(-1);
                    var today = DateTime.Today;
                    var tomorrow = DateTime.Today.AddDays(1);            
                    var vm = new Model()
                    {
                        Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
                        Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
                        Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
                    };
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-12
              • 1970-01-01
              • 1970-01-01
              • 2015-08-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多