Определение даты столкновения с использованием linq - PullRequest
3 голосов
/ 04 ноября 2011

Я ищу, чтобы определить строки, используя 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?

Ответы [ 3 ]

0 голосов
/ 04 ноября 2011

Если у вас есть список объектов со свойствами, как показано в вашей таблице, вы можете найти книги с одинаковыми названиями, имеющие конфликтующие даты, используя что-то вроде этого:

(Не проверял этот код, поэтому могут быть ошибки при опечатке.)

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)

0 голосов
/ 11 января 2012

Хотя эти столкновения, безусловно, можно идентифицировать в базе данных после того, как они произошли, было бы не лучше запретить второму лицу брать предмет, когда он уже запланирован для заимствования.В этом случае это было бы простым делом тестирования, чтобы убедиться, что ни в одной из существующих строк с ref_id 1343 дата возврата не будет больше, чем новая запрошенная дата заимствования.

0 голосов
/ 04 ноября 2011

Один путь был бы таким.Хотя это может быть более производительный вариант:

var collisions = myList.Where( d1 => !myList.Where( d => d != d1).All( d2 =>  d1.Return_Date <= d2.Borrow_Date|| d1.Borrow_Date >= d2.Return_Date));

Это вернет все строки, которые перекрываются хотя бы с одной строкой.В приведенном выше случае он вернет все три из них, поскольку строка с идентификатором 3 перекрывает и 1, и 2. Если вы измените 1 на Return_Date 17/09/2011, он вернет только 2 и 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...