C# LINQ Where子句内联for循环?

C# LINQ Where子句内联for循环?,c#,linq,entity-framework,linq-to-entities,where-clause,C#,Linq,Entity Framework,Linq To Entities,Where Clause,我有一个名为start和length的数据库值 开始是预订的开始时间(1->09:00、2->10:00等),长度是以小时为单位的长度 然后我有一个开始时间和结束时间的数组。我希望能够检查是否每个开始和结束对已经预订。到目前为止,我已经计算出,如果开始时间相同,它将被预订,或者如果结束时间相同,它也将被预订。但如果开始和结束时间介于比较时间之间,则返回not booked,这是错误的 我试图编写一个LINQ查询来测试数据库中是否已经有预订。到目前为止我有 var proposedRequest

我有一个名为start和length的数据库值

开始是预订的开始时间(1->09:00、2->10:00等),长度是以小时为单位的长度

然后我有一个开始时间和结束时间的数组。我希望能够检查是否每个开始和结束对已经预订。到目前为止,我已经计算出,如果开始时间相同,它将被预订,或者如果结束时间相同,它也将被预订。但如果开始和结束时间介于比较时间之间,则返回not booked,这是错误的

我试图编写一个LINQ查询来测试数据库中是否已经有预订。到目前为止我有

var proposedRequest = db.requests.Include(r => r.rooms);
proposedRequest = proposedRequest.Where(r => r.booked.Equals(1));
proposedRequest = proposedRequest.Where(r => r.roundID.Equals(roundID));
proposedRequest = proposedRequest.Where(r => r.day.Equals(day));

int[] startTimes = new int[length];
int[] endTimes = new int[length];
for(var q=0;q<length;q++)
{
    startTimes[q] = time + q;
    endTimes[q] = time + q + 1;
}
proposedRequest = proposedRequest.Where(s => startTimes.Contains(s.start) || endTimes.Contains(s.start+s.length));
var proposedRequest=db.requests.Include(r=>r.rooms);
proposedRequest=proposedRequest.其中(r=>r.booked.等于(1));
proposedRequest=proposedRequest.其中(r=>r.roundID.Equals(roundID));
proposedRequest=proposedRequest.其中(r=>r.day.等于(day));
int[]起始时间=新的int[长度];
int[]endTimes=新的int[长度];
对于(var q=0;q startTimes.Contains(s.start)| | endTimes.Contains(s.start+s.length));
现在,这只适用于新预订与DB中已有的预订同时开始,或同时结束的情况。这不考虑以下情况

数据库中有一条记录,其中开始->2和长度->3

所以这个预订从10:00->13:00开始

但是假设我在检查一个从11点开始到12点结束的条目。因为开始和结束时间不匹配,所以它不会像预定的那样回来

解决这个问题的最好办法是什么

我认为合适的唯一方法是循环我的startTime和endTime数组,并为每对数组使用另一个子句,该子句将生成如下内容:

.Where((s => s.startTime<startTime[i] && (s.startTime + s.Length) > endTime[i]) || (s => s.startTime<startTime[i+1] && (s.startTime + s.Length) > endTime[i+1]))
.Where((s=>s.startTime endTime[i])| |(s=>s.startTime endTime[i+1]))
但我认为这是不可能的。

根据答案,如果
(StartA=StartB)

就你而言:

StartA = s.start
EndA = s.start + s.length
StartB = time
EndB = time + length
所以你的最后一个条件应该是这样的:

proposedRequest = proposedRequest.Where(s => s.start <= time + length &&
                                             s.start + s.length >= time);
proposedRequest=proposedRequest.Where(s=>s.start=time);
根据答案,如果
(StartA=StartB)

就你而言:

StartA = s.start
EndA = s.start + s.length
StartB = time
EndB = time + length
所以你的最后一个条件应该是这样的:

proposedRequest = proposedRequest.Where(s => s.start <= time + length &&
                                             s.start + s.length >= time);
proposedRequest=proposedRequest.Where(s=>s.start=time);

这将返回包含StartTime、EndTime和布尔值的对象,该布尔值表示该对象是否已预订

var proposedRequest = db.requests
    .Include(r => r.rooms)
    .Where(r => r.booked.Equals(1))
    .Where(r => r.roundID.Equals(roundID))
    .Where(r => r.day.Equals(day))
    .ToList();

//int[] startTimes = new int[length];
//int[] endTimes = new int[length];
//for(var q=0;q<length;q++)
//{
//    startTimes[q] = time + q;
//    endTimes[q] = time + q + 1;
//}
var times=Enumerable
   .Range(time,length)
   .Select(r=>
       new {
           StartTime=r,
           EndTime=r+1,
           Booked=proposedRequest.Any(pr=>pr.StartTime<=r && pr.StartTime+pr.Length>r)
           }).ToList();
var proposedRequest=db.requests
.包括(r=>r.rooms)
.式中(r=>r.等于(1))
其中(r=>r.roundID.Equals(roundID))
.式中(r=>r.day.等于(day))
.ToList();
//int[]起始时间=新的int[长度];
//int[]endTimes=新的int[长度];
//对于(var q=0;q
新的{
StartTime=r,
EndTime=r+1,
预订=提议请求任何(pr=>pr.StartTimer)
}).ToList();

这将返回包含StartTime、EndTime和布尔值的对象,该布尔值表示该对象是否已预订

var proposedRequest = db.requests
    .Include(r => r.rooms)
    .Where(r => r.booked.Equals(1))
    .Where(r => r.roundID.Equals(roundID))
    .Where(r => r.day.Equals(day))
    .ToList();

//int[] startTimes = new int[length];
//int[] endTimes = new int[length];
//for(var q=0;q<length;q++)
//{
//    startTimes[q] = time + q;
//    endTimes[q] = time + q + 1;
//}
var times=Enumerable
   .Range(time,length)
   .Select(r=>
       new {
           StartTime=r,
           EndTime=r+1,
           Booked=proposedRequest.Any(pr=>pr.StartTime<=r && pr.StartTime+pr.Length>r)
           }).ToList();
var proposedRequest=db.requests
.包括(r=>r.rooms)
.式中(r=>r.等于(1))
其中(r=>r.roundID.Equals(roundID))
.式中(r=>r.day.等于(day))
.ToList();
//int[]起始时间=新的int[长度];
//int[]endTimes=新的int[长度];
//对于(var q=0;q
新的{
StartTime=r,
EndTime=r+1,
预订=提议请求任何(pr=>pr.StartTimer)
}).ToList();


这应该会有帮助:但是你让自己变得更加困难,因为你没有将日期时间存储在日期时间字段中。@RobertMcKee他们的预订系统im building很奇怪,可以连续几周工作。这就是我无法存储日期时间字段的原因,也是您的链接无法应用于我的问题的原因。我用整数表示简单的天数。链接仍然适用,david.s在下面为您进行了转换。开始/结束时间始终在同一天和同一轮,或者每个开始/结束都会改变吗?@RobertMcKee总是在同一天和同一轮这应该会有所帮助:但是你让自己变得更加困难,因为你没有将日期时间存储在日期时间字段中。@RobertMcKee他们建立的预订系统很奇怪,可以连续几周和几轮工作。这就是我无法存储日期时间字段的原因,也是您的链接无法应用于我的问题的原因。我用整数表示简单的天数。链接仍然适用,下面由david.s为您进行了转换。开始/结束时间总是在同一天和同一轮,或者每个开始/结束时间都会改变吗?@RobertMcKee always in The day和round我的问题可能有点模糊。我在上面增加了一些细节。我有一个开始和结束时间的数组。@user2976358所以你有一个时间数组(比如
int[]times
)和一个长度数组(比如
int[]length
)?我在上面代码中的for循环将预订分成一个小时的间隔,所以从2开始到3结束。endTimes数组实际上是不相关的,因为它只是startTime值+1@user2976358但是为什么你需要把预订分成一个小时的间隔呢?要检查新预订(按时间和长度给出)是否与现有预订重叠,上面的答案就足够了。我的问题可能有点模糊。我在上面增加了一些细节。我有一个开始和结束时间的数组。@user2976358所以你有一个时间数组(比如
int[]times
)和一个长度数组(比如
int[]length
)?我在上面代码中的for循环将预订分成一个小时的间隔,所以从2开始到3结束。endTimes数组实际上是不相关的,因为它只是startTime值+1@user2976358但是为什么你需要把预订分成一个小时的间隔呢?要检查新预订(按时间和长度给出)是否与现有预订重叠,上面的答案就足够了。尽管名称看起来很奇怪<代码>提议的请求不是提议的吗?这些已经在数据库中了。难道不是吗