3

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

我的表如下所示:

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

3 回答 3

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;
于 2013-05-10T18:23:52.877 回答
1

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

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

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

于 2013-05-10T18:23:15.640 回答
1

您应该首先获得ParentRecordIds 的列表,然后检查是否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;
于 2013-05-10T18:39:39.990 回答