如果输入不在一个范围内,则插入数据库

时间:2018-03-07 17:47:12

标签: c# sql linq

作为输入,我得到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条件并且申请没有参加此条目。 对我有什么建议我如何改进我的代码?

1 个答案:

答案 0 :(得分:3)

你的逻辑有点偏。在所有情况下,您都会将StartDateUserStartDateEndDateUserEndDate进行比较。相反,你应该在每种情况下比较相同的东西。见下文:

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个条件中的UserStartDateUserEndDate进行了比较,EndDateUserStartDate和{{UserEndDate进行了比较1}}在底部2条件。

  

我不应该允许这样做,因为在我的数据库中,我已经有一个在这个时间范围内很常见的条目。

这意味着您担心的唯一条件是,UserStartDateUserEndDate位于StartDateEndDate的相对位置,如下所示。< / p>

enter image description here

如果满足以下任一条件,您将始终处于相同的日期范围内。

<强>更新

上述代码已更新,因为OP表明UserStartDate实际上可能与EndDate相同,或UserEndDate可能与StartDate相同但不要算作重叠数据。

<强> UPDATE2:

正如OP指出的那样,我忘记了UserStartDateUserEndDate都在日期范围内的情况。根据OP的评论,该行如下:

st.StartDate <= UserStartDate && st.EndDate >= User.EndDate && st.Status == "Queued"