使用 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 识别日期冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何更好地识别 SQL 中指定的开始和结束端点内的表冲突?

LINQ to Entity 减去 2 个日期

LINQ to Entities 格式化日期异常 [重复]

错误:LINQ to Entities 无法识别方法 DataLength

LINQ to Entities 无法识别方法“布尔包含 [Int32]

LINQ to Entities 无法识别方法“System.String ToString(Int32)”