使用linq识别日期冲突
本文关键字:冲突 日期 识别 linq 使用 | 更新日期: 2023-09-27 18:13:27
我正在寻找使用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的现有行没有返回日期等于或大于新请求的借阅日期。