LINQ Where子句内联for循环?
LINQ Where clause inline for loop?
我有称为开始和长度的数据库值。
start 是预订的开始时间(1->09:00、2->10:00 等),length 是以小时为单位的长度。
然后我有一组开始时间和结束时间。我希望能够检查每个开始和结束对是否已经被预订。到目前为止,我认为如果开始时间相同,则预订,或者如果结束时间相同,则也预订。但如果开始和结束时间在比较时间之间,则return未预订,这是错误的。
我正在尝试编写 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));
现在,这仅适用于新预订与数据库中已有预订同时开始或同时结束的情况。这不看下面的case
数据库中有一条记录,其中开始 -> 2 和长度 ->3。
因此此预订从 10:00->13:00 开始。
但是说我正在对照从 11:00 开始并在 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]))
但我认为这是不可能的。
根据 this 的回答,如果 (StartA <= EndB) and (EndA >= 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);
这将 return 具有您的开始时间、结束时间和表示是否已预订的布尔值的对象。
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();
我有称为开始和长度的数据库值。
start 是预订的开始时间(1->09:00、2->10:00 等),length 是以小时为单位的长度。
然后我有一组开始时间和结束时间。我希望能够检查每个开始和结束对是否已经被预订。到目前为止,我认为如果开始时间相同,则预订,或者如果结束时间相同,则也预订。但如果开始和结束时间在比较时间之间,则return未预订,这是错误的。
我正在尝试编写 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));
现在,这仅适用于新预订与数据库中已有预订同时开始或同时结束的情况。这不看下面的case
数据库中有一条记录,其中开始 -> 2 和长度 ->3。
因此此预订从 10:00->13:00 开始。
但是说我正在对照从 11:00 开始并在 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]))
但我认为这是不可能的。
根据 this 的回答,如果 (StartA <= EndB) and (EndA >= 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);
这将 return 具有您的开始时间、结束时间和表示是否已预订的布尔值的对象。
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();