2013-05-11 75 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,日期= 2012/05/15个I需要使用的recordId = 1
  2. 返回记录,如果给定:的recordId = 4,日期= 2012年5月25日我需要返回记录与RecordId = 3
  3. 如果给定:RecordId = 2和日期= 2012/06/10我需要返回记录与RecordId = 2
  4. 如果给出:RecordId = 2和日期= 2012/01/01我需要返回NULL
  5. 如果考虑到:的recordId = 1,日期= 2012/6月1日,我需要用的recordId返回记录= 4

我认为这将是一个复杂的连接和计算,我已经一直在努力挣扎几个小时而没有任何成功。
这里有一个方法的样机我需要实现:

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 2013-05-13 14:26:51

+0

嘿,谢谢你的回复。我从你的代码中得到了这个想法,最终的代码有点不同,但是非常感谢! – user194076 2013-05-14 01:54:11