2015-08-21 88 views
0

我有以下linq查询,其中我想使用group by子句。在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中仅获取不同的记录。但我无法做到这一点。如果有人能帮助我。

回答

-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}); 
+0

MoreLinq是LINQ-to-Objects ... OP明确标记的问题LINQ-to-SQL –

0

幸运的是,你使用LINQ到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取第一个重复项。