【问题标题】:LINQ - How to query a range of effective dates that only has start datesLINQ - 如何查询只有开始日期的有效日期范围
【发布时间】:2011-02-09 00:29:55
【问题描述】:

我正在使用 C# 3.5 和 EntityFramework。我在数据库中有一个包含利率的项目列表。不幸的是,此列表仅包含有效开始日期。我需要在这个列表中查询一个范围内的所有项目。

但是,如果不查询数据库两次,我就看不到这样做的方法。 (虽然我想知道使用 EntityFramework 延迟执行是否只进行一次调用。)无论如何,我想知道是否可以在不使用我的上下文两次的情况下做到这一点。

internal IQueryable<Interest> GetInterests(DateTime startDate, DateTime endDate)  {
    var FirstDate = Context.All().Where(x => x.START_DATE < startDate).Max(x => x.START_DATE);
    IQueryable<Interest> listOfItems = Context.All().Where(x => x.START_DATE >= FirstDate && x.START_DATE <= endDate);
    return listOfItems;
}

【问题讨论】:

  • 我认为您的意思是“我需要查询此列表以查找涵盖范围的所有项目”而不是“范围内”,因为您想要范围开始之前的最后一个值以及在范围内开始的任何值范围,对吧?

标签: c# linq entity-framework .net-3.5


【解决方案1】:

如果您可以使用 LINQ 查询,则可以使用 let 来执行此操作:

(from c in dbContext.Table
let firstdate = dbContext.Table.Max(i => c.StartDate < startDate)
where c.StartDate >= firstdate
and c.StartDate <= enddate
select c)

我不确定 max 是否会以这种方式工作,因此您可能需要这样做:

(from c in dbContext.Table
let firstdate = dbContext.Table.Select(i => i.StartDate).Max(i => c.StartDate < i)
where c.StartDate >= firstdate
and c.StartDate <= enddate
select c)

类似的东西。

【讨论】:

  • 没有 c.EndDate - itchi 每条记录只有一个 DateTime 值 - 一个起始值。
  • 是的,我原来是这样写的,然后转成lambda语法。但是这两个上下文调用困扰了我。
  • @Hightechrider 谢谢,更新了帖子。 @itchi 扩展方法肯定是可行的,但是 LINQ 查询可以更易读,恕我直言,再加上 let 执行子查询,而不是单独的查询。
【解决方案2】:

我没有在 EF 上尝试过,但在 Linq to objects 上它工作正常:

var result = source
  .OrderBy(x => x.start)
  .GroupBy(x => x.start < startDate)
  .SelectMany((x, i) => i == 0 ? new[] {new { value = x.Last().value, start = x.Last().start }} : x.Where(y => y.start < endDate));

问题是 C# LINQ 缺少一个运算符,该运算符使您可以访问序列中的前一项。 F# 显然可以处理这个问题。变通方法涉及 GroupBy 或 Aggregate 操作。在这种情况下,GroupBy 可以处理。

它不漂亮,我不建议在两阶段方法中使用它。

【讨论】:

  • 谢谢,缺少运算符的 C# LINQ 得到了答案,向我展示了为什么我不能按照我想要的方式编写它。 F# 是一个有趣的想法。
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2017-09-24
  • 2011-09-29
  • 1970-01-01
  • 2017-04-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多