我希望在有日期冲突的情况下使用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轻松识别日期范围冲突?
答案 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的现有行的返回日期等于或大于新请求的借用日期。