在linq查询中使用group by

时间:2015-08-21 07:19:23

标签: sql linq entity-framework linq-to-sql

我有以下linq查询,其中我想使用group by子句。

var objList = from o in db.sometable1
            join p in db.sometable2 on o.someid equals p.Id
            join q in db.sometable3 on p.someid equals q.Id
            join r in db.sometable4 on p.someid equals r.Id
            join s in db.soetable5 on o.someid equals s.Id
            --group o by o.someid // what i am tru=ying
            select new
            {                
                  o.Id,
                  r.somecolumn,
                  r.somecolumn,
                  s.Name,
                  o.somecolumn,
                  p.somecolumn,
                  q.somecolumn,
                  r.somecolumn
            };

我想根据该表中的一列(someId)从sometable1中获取不同的记录。但我无法做到这一点。如果有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

幸运的是,您正在使用LINQ-to-SQL,因此可以简化许多join s:

var objList = from o in db.SomeTable1
              select new
              {
                    o.Id,
                    o.SomeTable4.SomeColumn1,
                    o.SomeTable4.SomeColumn2,
                    o.SomeTable5.Name,
                    o.SomeColumn,
                    o.SomeTable2.SomeColumn,
                    o.SomeTable3.SomeColumn,
                    o.SomeTable4.SomeColumn3,
              };

请参阅Querying Across RelationshipsNavigate > Join

现在进行分组:

var groups = from o in db.SomeTable1
             group new
             {   
                 o.Id,
                 o.SomeTable4.SomeColumn1,
                 o.SomeTable4.SomeColumn2,
                 o.SomeTable5.Name,
                 o.SomeColumn,
                 o.SomeTable2.SomeColumn,
                 o.SomeTable3.SomeColumn,
                 o.SomeTable4.SomeColumn3,
             } by o.SomeId;

返回IQueryable<IGrouping<some-id-type, anonymous-type>>,您可以按如下方式使用:

foreach (var group in groups)
{
    var someId = group.Key; // the original SomeId property
    var theOnlyRecord = group.SingleOrDefault(); // this will throw if more than one record matches someId
}

这假设只有一条记录匹配SomeId的每个值,因此SingleOrDefault;如果可以有多个,那么您必须应用某种自己的选择机制,其中最直接的选择机制将SingleOrDefault替换为FirstOrDefault,只需采用第一个SomeId的每个值的重复项。

答案 1 :(得分:-1)

实现此要求的第一种方法是使用MoreLinq库,它支持名为DistinctBy的函数,您可以在其中指定要在其上查找Distinct对象的属性。

var objList = from o in db.sometable
            join p in db.sometable2 on o.someid equals p.Id
            join q in db.sometable3 on p.someid equals q.Id
            join r in db.sometable4 on p.someid equals r.Id
            join s in db.soetable5 on o.someid equals s.Id
            --group o by o.someid // what i am tru=ying
            select new
            {                
                  o.Id,
                  r.somecolumn,
                  r1.somecolumn,
                  s.Name,
                  o1.somecolumn,
                  p.somecolumn,
                  q.somecolumn,
                  r2.somecolumn
            }.DistinctBy(x=>new{x.o,x.r,x.r1,x.s,x.o1,x.p,x.q,x.r2});