2013-05-11 2 views
0

Учитывая таблицу, как это:Выберите запись самолечением иерархии, которая попадает в диапазон дат

RecordId CreatedDate ParentRecordId 
    1  2012/05/10  NULL 
    2  2012/05/13  NULL 
    3  2012/05/20  1  
    4  2012/05/30  3  

Мне нужно выяснить, запись, которая находится между созданы даты дают даты и RecordId.

примеры Пара:

  1. Если Дано: RecordId = 4 и Date = 2012/05/15 Мне нужно вернуть запись с RecordId = 1
  2. если Дано: RecordId = 4 и Date = 2012/05/25 Мне нужно вернуть запись с RecordId = 3
  3. Если дано: RecordId = 2 и Date = 2012/06/10 Мне нужно вернуть запись с RecordId = 2
  4. Если дано: RecordId = 2 и Дата = 2012/01/01 Мне нужно вернуть NULL
  5. 444 +42760359211350144688888 Если Дано: RecordId = 1 и Date = 2012/06/01 Мне нужно вернуть запись с RecordId =

Я думаю, что это должно быть сложным набором соединений и расчеты, Я борется за пару часов без каких-либо успехов.
Вот макет метода мне нужно реализовать:

public Record GetRecord(int RecordId, DateTime Date) 
{ 
    var query = ??? 
    return query; 
} 

ответ

1

Это может быть решена с помощью рекурсии, например:

public Record GetRecord(int RecordId, DateTime Date) 
{ 
    var r = records.firstOrDefault(record => record.Id == RecordId && record.Date < Date) 

    if(r != null && r.ParentId != null) 
    return GetRecord(r.ParentId, Date) // Get the parent, if existing.. 
    else 
    return r;       // Return the matching record 
} 

Не уверен, что если я покрывал всю вашу логику, но вы должны уметь работать по вышеуказанному коду :)

+0

@ user194076 Если мой ответ ответит на ваш вопрос, отметьте его как таковой :) – JAM

+0

Эй, спасибо за ваш ответ. Я действительно получил идею от вашего кода, окончательный код немного отличается, но спасибо большое! – user194076