2011-11-04 43 views
3

我正在尋找使用linq哪裏有日期衝突的行。我(在這個例子中)5列使用linq識別日期衝突

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

一種方法就是這樣。雖然它可能是更高性能的變體:

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.

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); 

您可能會得到重複的結果。 (即身份證1和3以及身份證3和1)

0

儘管在發生數據庫時確實有可能識別這些衝突,但是防止第二人借用物品時不會更好它已經預定要借。在這種情況下,這將是一個簡單的測試問題,以確保ref_id爲1343的現有行的返回日期等於或大於新請求的借入日期。