作为输入,我得到startDate和endDate。我必须从客户端执行linq查询,以检查在这段时间内DB中是否存在任何现有条目。
例如,在我的数据库中,如果我有一个条目,其StartDate为2018-01-05,结束日期为2018-01-09,并且用户尝试放入另一个条目,其开始日期为2018-01-04,结束日期为2018年-01-06我不应该允许这样做,因为在我的数据库中我已经有一个在这个时间范围内很常见的条目。这是我的代码
var stDate = dbcontext.tables.Where( st =>
st.StartDate <= UserStartDate && st.EndDate >= UserEndDate && st.Status == "Queued" ||
st.StartDate >= UserStartDate && st.EndDate >= UserEndDate && st.Status == "Queued" ||
st.StartDate <= UserStartDate && st.EndDate <= UserEndDate && st.Status == "Queued" ||
st.StartDate >= UserStartDate && st.EndDate <= UserEndDate && st.Status == "Queued").ToList();
if (stDate.Count >0 )
{
//notification to user("There is an existing request within this time range");
}
else
{
// do the rest operation
}
但问题是如果有人试图从2018-01-09到2018-01-10输入一个条目,它属于3条件并且申请没有参加此条目。 对我有什么建议我如何改进我的代码?
答案 0 :(得分:3)
你的逻辑有点偏。在所有情况下,您都会将StartDate
与UserStartDate
和EndDate
与UserEndDate
进行比较。相反,你应该在每种情况下比较相同的东西。见下文:
var stDate = dbcontext.tables
.Where(st => st.Status == "Queued"
&& ( st.StartDate >= UserStartDate && st.StartDate < UserEndDate
|| st.StartDate > UserStartDate && st.StartDate <= UserEndDate
|| st.EndDate >= UserStartDate && st.EndDate < UserEndDate
|| st.EndDate > UserStartDate && st.EndDate <= UserEndDate )
).ToList();
请注意,StartDate
与前2个条件中的UserStartDate
和UserEndDate
进行了比较,EndDate
与UserStartDate
和{{UserEndDate
进行了比较1}}在底部2条件。
我不应该允许这样做,因为在我的数据库中,我已经有一个在这个时间范围内很常见的条目。
这意味着您担心的唯一条件是,UserStartDate
和UserEndDate
位于StartDate
或EndDate
的相对位置,如下所示。< / p>
如果满足以下任一条件,您将始终处于相同的日期范围内。
<强>更新强>
上述代码已更新,因为OP表明UserStartDate
实际上可能与EndDate
相同,或UserEndDate
可能与StartDate
相同但不要算作重叠数据。
<强> UPDATE2:强>
正如OP指出的那样,我忘记了UserStartDate
和UserEndDate
都在日期范围内的情况。根据OP的评论,该行如下:
st.StartDate <= UserStartDate && st.EndDate >= User.EndDate && st.Status == "Queued"