使用linq识别日期冲突



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

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

在这种情况下,我的'Gate'发生冲突,因为有人想借它,而其他人也想借它。

是否有任何方法可以轻松地使用linq识别日期范围冲突?

一种方法是这样的。可能会有更高性能的变体:

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。

如果您有一个表中所示的具有属性的对象列表,则可以使用如下命令查找具有相同标题但日期冲突的图书:

(还没有测试过这段代码,所以可能有一些拼写错误。)

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);

你可能会得到重复的结果。(即ID 1和3,以及ID 3和1)

虽然一旦这些冲突发生,就可以在数据库中识别出来,但是在已经安排借书的情况下,阻止第二个人借书不是更好吗?在这种情况下,这将是一个简单的测试问题,以确保ref_id为1343的现有行没有返回日期等于或大于新请求的借阅日期。

最新更新