【问题标题】:LINQ statement to find the max amount days using datetime使用日期时间查找最大天数的 LINQ 语句
【发布时间】:2014-07-04 05:39:33
【问题描述】:

我正在尝试创建一个 LINQ 语句,它将给出开始日期和结束日期之间的最大天数。

所以我有这个声明,得到所有已关闭的问题:

var issuesClosed = whseTasks.Where(t => t.CompDate != null);

从这个问题列表中,我想找到每条记录的给定 issue.StartDate 和 issue.EndDate 之间的最大天数,然后选择天数最多的记录。

前:

1 |问题。开始日期 = 2014 年 7 月 3 日 | issue.EndDate = 7/5/2014 = 2 天

2 |问题。开始日期 = 2014 年 7 月 1 日 | issue.EndDate = 7/5/2014 = 4 天

3 |问题。开始日期 = 2014 年 7 月 1 日 | issue.EndDate = 7/6/2014 = 5 天

我想选择记录 3,因为它的天数最多。

【问题讨论】:

  • 这是linq to sql 吗?
  • 意识到您要求的是Non-Sargable query。这将不使用索引并遍历每条记录。如果这是针对最终用户的,请记住您的用户体验。
  • @ErikPhilips - 我已经告诉人们这件事很长时间了,但从来不知道“sargable”这个词。感谢您扩展我的词汇量!

标签: c# sql linq


【解决方案1】:
var issues = new[]
{
    new Issue { StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(4) },
    new Issue { StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(12) },
    new Issue { StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(1) }
};

var theIssue =
    issues.OrderBy(issue => (issue.StartDate - issue.EndDate).TotalDays)
          .First();

【讨论】:

  • 非常感谢!非常感谢!
  • 如果涉及到 LINQ to SQL,我不确定日期时间减法是否有效。如果没有,应该可以执行issues.Select(_ => new { _.StartDate, _.EndDate }).ToArray() 之类的操作,然后从内存中的集合继续。
  • 这在执行时真的有效吗?不确定 LINQ 提供程序是否能够翻译 TimeSpan
【解决方案2】:

选择两个日期之间差异最大的记录应该可以完成这项工作

whseTasks.Where(t => t.CompDate != null)
         .Max(x => x.EndDate - x.StartDate);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2019-03-21
    相关资源
    最近更新 更多