LINQ - 如何查询仅具有开始日期的有效日期范围

时间:2010-04-16 21:46:20

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

我正在使用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 个答案:

答案 0 :(得分:3)

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

类似的东西。

答案 1 :(得分:1)

我没有在EF上尝试这个,但在Linq上对象它可以正常工作:

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可以处理它。

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