使用linq识别日期冲突

时间:2011-11-04 11:12:27

标签: c# asp.net linq asp.net-mvc-3 entity-framework

我希望在有日期冲突的情况下使用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

在这种情况下,我的“门”发生了冲突,因为当别人也想借用它时,有人想借用它。

无论如何使用linq轻松识别日期范围冲突?

3 个答案:

答案 0 :(得分: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。 / p>

答案 1 :(得分: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);

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

答案 2 :(得分:0)

虽然一旦发生这些冲突当然有可能在数据库中识别这些冲突,但防止第二个人在已经计划借用的时候借用一个项目是不是更好。在这种情况下,这将是一个简单的测试问题,以确保ref_id为1343的现有行的返回日期等于或大于新请求的借用日期。