代码之家  ›  专栏  ›  技术社区  ›  itchi

LINQ-如何查询只有开始日期的生效日期范围

  •  2
  • itchi  · 技术社区  · 16 年前

    我用的是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;
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Ian Mercer    16 年前

    我没有在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或聚合操作。在这种情况下,groupby可以处理它。

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

        2
  •  2
  •   Brian Mains    16 年前

    如果可以使用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)
    

    差不多吧。