我正在使用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;
}
答案 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可以处理它。
它并不漂亮,我不建议在两阶段方法中使用它。