2011-11-04 45 views
3

我正在寻找使用linq哪里有日期冲突的行。我(在这个例子中)5列使用linq识别日期冲突

ID ref_id ref_Name Borrow_Date Return_Date 
1 1343  Gate  13/09/2011 20/09/2011 
2 1352  Door  20/09/2011 22/09/2011 
3 1343  Gate  17/09/2011 21/09/2011 

在这种情况下,我的“门”的冲突是因为有人想借用一下别人的时候也想借用它。

是否有反正很容易确定使用linq的日期范围冲突?

回答

0

一种方法就是这样。虽然它可能是更高性能的变体:

var collisions = myList.Where(d1 => !myList.Where(d => d != d1).All(d2 => d1.Return_Date <= d2.Borrow_Date|| d1.Borrow_Date >= d2.Return_Date)); 

这将返回与至少一个其他行重叠的所有行。在上面的情况下,它将返回它们全部三个,因为ID 3的行与1和2重叠。如果你改变1以具有Return_Date 17/09/2011,它将只返回2和3.

0

如果你有一个列表中的属性如表中所示,你可以找到具有相同标题的书籍使用类似这样的日期冲突:

(未测试此代码,所以可能会有一些错字错误)。

var collisions = collection 
       .Join(collection, x => x.ref_Name, y => y.ref_Name, 
           (x, y) => new { 
               ID_x = x.ID, 
               ID_y = y.ID, 
               ref_id = x.ref_id, 
               ref_Name = x.ref_Name, 
               Borrow_Date_x = x.Borrow_Date, 
               Borrow_Date_y = y.Borrow_Date, 
               Return_Date_x = x.Return_Date, 
               Return_Date_y = y.Return_Date 
               } 
         ) 
       .Where(z => (z.Return_Date_x > z.Borrow_Date_y && z.Borrow_Date_x < z.Return_Date_y)) 
       .Where(z => z.ID_x != z.ID_y); 

您可能会得到重复的结果。 (即身份证1和3以及身份证3和1)

0

尽管在发生数据库时确实有可能识别这些冲突,但是防止第二人借用物品时不会更好它已经预定要借。在这种情况下,这将是一个简单的测试问题,以确保ref_id为1343的现有行的返回日期等于或大于新请求的借入日期。