2012-03-23 130 views
0

使用EF4和LINQLinq GroupBY TakeWhile?

我有一个数据结构,它看起来像这样:

parentid childid version 
     1   2  1 
     1   3  1 
     1   4  1 
     1   2  2 
     1   3  2 
     1   5  2 
    ... 

也就是说,我要选择的parentid,childID的但只适用于最高版本,对于每一个parentId的有在数据库中。

我第一次尝试是这样的:

var links = data 
      .GroupBy (link => link.parentid) 
      .Select(ig => ig.OrderByDescending(link => link.version).First()) 
      .Select (link => new .......); 

然而,这显然只能选择子ID对每个父ID之一..

在样本数据上面我想孩子IDS 2,3,5从版本2母1是..

+0

您应该按照parentid进行分组,并按照版本分组。我现在没有时间去解决问题。如果仍然有必要,我会稍后再试。 – 2012-03-24 22:09:46

回答

0

最后我用这样的子查询:

var links = data 
    .OrderBy(link => link.parentid) 
    .ThenBy(link => link.childid) 
    .Where(o => o.version == data 
      .Where(i => i.version == o.version).Max(l => l.version)) 
    .Select(link => new ....); 

这样,我得到在db所有的parentid与只与孩子们该特定父级的最大版本。

0

这应该满足你的要求..

var links = data.Where(x => x.version == data.Max(y => y.version)) 
       .OrderBy(x => x.childid) 
       .Select(x => new {parentid = x.parentid, childid = x.childid}); 

,如果你只需要母公司1,则

var links = data.Where(x => x.version == data.Max(y => y.version)) 
       .Where(x => x.parentid == 1) 
       .OrderBy(x => x.childid) 
       .Select(x => new {parentid = x.parentid, childid = x.childid}); 
+0

那甚至没有有效的代码。版本是一个标量字段,因此不能用于最大查询.. – 2012-03-23 13:26:05

+0

是的..但我想你有想法..请检查更新.. – Flowerking 2012-03-23 13:43:48