2015-08-21 83 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取第一個重複項。