Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-如何查询只有开始日期的生效日期范围_C#_Linq_Entity Framework_.net 3.5 - Fatal编程技术网

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

C# LINQ-如何查询只有开始日期的生效日期范围,c#,linq,entity-framework,.net-3.5,C#,Linq,Entity Framework,.net 3.5,我正在使用C#3.5和EntityFramework。我在数据库中有一个包含利率的项目列表。不幸的是,此列表仅包含有效的开始日期。我需要查询此列表中某个范围内的所有项目 但是,如果不查询数据库两次,我就看不到实现这一点的方法。(尽管我想知道EntityFramework的延迟执行是否只进行了一次调用。)无论如何,我想知道我是否可以在不使用上下文两次的情况下完成这项工作 internal IQueryable<Interest> GetInterests(DateTime startD

我正在使用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;
}
内部IQueryable GetInterest(日期时间开始日期、日期时间结束日期){
var FirstDate=Context.All(),其中(x=>x.START\u DATEx.START\u DATE);

IQueryable listOfItems=Context.All()。其中(x=>x.START\u DATE>=FirstDate&&x.START\u DATE如果可以使用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)
(来自dbContext.Table中的c
设firstdate=dbContext.Table.Max(i=>c.StartDate=firstdate

c.StartDate我没有在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));
var结果=源
.OrderBy(x=>x.start)
.GroupBy(x=>x.starti==0?新[]{new{value=x.Last().value,start=x.Last().start}}}:x.Where(y=>y.start
问题是C#LINQ缺少一个运算符,该运算符允许您访问序列中的前一项。F#显然可以处理此问题。解决方法涉及GroupBy或聚合操作。在这种情况下,GroupBy可以处理它


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

我想你的意思是“我需要查询此列表中覆盖某个范围的所有项目”,而不是“在某个范围内”因为你想要范围开始之前的最后一个值和范围内开始的任何值,对吗?没有c.EndDate-itchi每个记录只有一个DateTime值-一个开始值。是的,我最初是这样写的,然后将其转换为lambda语法。但是对上下文的两个调用困扰了我。@Hightechrider谢谢,updated这篇文章。@itchi扩展方法确实可行,但LINQ查询的可读性更高IMHO,再加上let执行子查询,而不是单独的查询。谢谢,C#LINQ缺少一个运算符,它为我提供了一个答案,告诉我为什么不能按我想要的方式编写。F#是一个有趣的想法。
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));