Linq选择最新的组层次结构

时间:2013-05-10 18:17:38

标签: c# .net linq asp.net-mvc-4

如果存在自引用层次结构的记录,我想获取每个组的最新记录。

我的表格如下:

RecordId CreatedDate ParentRecordId
   1     2012/05/13       NULL   
   2     2012/05/13       NULL   
   3     2012/05/14        1     
   4     2012/05/15        3     

我想只选择最新版本的记录 所以在这种情况下我只想选择RecordId = 2和RecordId = 4。

到目前为止,这是我所拥有的,而且我被卡住了。

     db.Records
       .Where(x => x.ParentRecordId!= null).GroupBy(x => x.ParentRecordId)
       .SelectMany(x=>x.OrderByDescending(y=>y.CreatedDate).Take(1)).ToList();

3 个答案:

答案 0 :(得分:2)

我的左连接有点缺乏,但是这样的事情应该这样做;

var query = from r1 in db.Records
            join r2 in db.Records
                on r1.RecordId equals r2.ParentRecordId into rec
            from r in rec.DefaultIfEmpty()
            where r == null
            select r1;

答案 1 :(得分:1)

如何回答“获取没有其他条目认为我是父母的条目”的查询。这听起来像是一回事,除非我误解:

db.Records.Where(x => !db.Records
    .Select(r => r.ParentRecordId).Contains(x.RecordId))

但是,我对“圆形”的含义感到有些困惑。层次结构如何成为循环?

答案 2 :(得分:1)

首先应该获得ParentRecordId的列表,然后检查RecordId是否在该列表中,如果是,那么我们应该从结果中排除它:

var parentIds = db.Records
                .Where(r => r.ParentRecordId != null)
                .Select(r => r.ParentRecordId)
                // this ToList call may increase performance. Depending 
                // on the size of the result set we may not want to call
                // the database every time for this info
                .ToList();
var wantedRecords = from r in db.Records
                    where !parentIds.Contains(r.RecordId)
                    select r;