【问题标题】:How to get items that were effective within a date range in linq如何在linq中获取日期范围内有效的项目
【发布时间】:2020-02-07 10:46:06
【问题描述】:

我有一个实体项目表,我需要查询。

每个项目都有两个属性:IdEffectiveDate

我需要一个日期范围内所有有效项目的列表。

这是我目前所拥有的:

var monthStart = new DateTime(2019, 10, 1);
var monthEnd = new DateTime(2019, 10, 31);

var items = dbContext.Items
     .OrderByDescending(a => a.EffectiveDate)
     .where(m => m.EffectiveDate <= monthEnd && m.EffectiveDate > monthStart)

这会得到所有正确的项目,除了一个。它需要获取期间和开始日期之前的最后一个内所有生效日期的项目。 现在它会获取所有有效期内的生效日期。

有没有办法在单个查询中做到这一点?

例如 我们有这些生效日期(DD/MM/YYYY)的项目:

  1. 05/05/2000
  2. 07/01/2005
  3. 08/07/2019
  4. 12/07/2019
  5. 15/07/2019
  6. 15/08/2019

我想要在 01/07/201931/07/2019 之间有效的项目,结果将是:

  1. 07/01/2005
  2. 08/07/2019
  3. 12/07/2019
  4. 15/07/2019

【问题讨论】:

  • 你能提供一个示例输入列表和想要的结果吗?
  • 我现在添加了一个示例输入和输出
  • monthStart newed 的时间为“00:00:00”,但是如果您的比较日期(例如 e.EffectiveDate)有一些不同的时间怎么办? where 表达式不会给出想要的结果...
  • 我想不出用一个表达式来处理这个问题的方法。我会保留您当前的表达式,然后使用输入列表的排序版本来获取与your first result -1 对应的索引。不过,您很可能需要在此处进行一些检查,以确保您在范围内。
  • 如果您能定义plus one more 的含义,将会有所帮助。是任何一个吗?还是开始日期前的最后一个?还是开始日期之后的第一个?还是随便一个?

标签: c# entity-framework linq linq-to-entities


【解决方案1】:

您可以像这样将您的列表与另一个子查询连接起来:

var monthStart = new DateTime(2019, 10, 1);
var monthEnd = new DateTime(2019, 10, 31);

var items = dbContext.Items
     .OrderByDescending(a => a.EffectiveDate)
     .Where(m => m.EffectiveDate <= monthEnd && m.EffectiveDate > monthStart)
     .Concat(dbContext.Items.Where(d => d.EffectiveDate < monthStart).TakeLast(1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-02-26
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多