使用 linq 识别日期冲突
Posted
技术标签:
【中文标题】使用 linq 识别日期冲突【英文标题】:Identifying Date ***es using linq 【发布时间】:2011-12-21 22:38:51 【问题描述】:我希望使用 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 识别日期范围冲突?
【问题讨论】:
【参考方案1】:一种方法是这样的。不过,它可能是性能更高的变体:
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。
【讨论】:
【参考方案2】:如果您有一个具有如表中所示属性的对象列表,您可以使用以下方法找出具有相同标题但日期冲突的书籍:
(未测试此代码,因此可能存在一些拼写错误。)
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)
【讨论】:
【参考方案3】:虽然一旦发生冲突当然可以在数据库中识别出这些冲突,但防止第二个人在已安排借用的项目中借用不是更好吗?在这种情况下,这将是一个简单的测试问题,以确保没有 ref_id 为 1343 的现有行的返回日期等于或大于新请求的借用日期。
【讨论】:
以上是关于使用 linq 识别日期冲突的主要内容,如果未能解决你的问题,请参考以下文章
错误:LINQ to Entities 无法识别方法 DataLength