2010-11-25 43 views
2

我有被分組LINQ:幫助groupby,似乎不像SQL :-)只能讓我返回.Key和其他東西?

var results = from c in C 
    join h in h on c.Code equals 
     h.Code 
    join m in M on c.Code equals 
     m.Code 
      group c by c.Code into g 
      select 
       new 
       { 
       Group = g.Key, 
       Total = g.Count() 
       } 

的偉大工程,以下LINQ查詢,返回2條記錄,1項有4個記錄道達爾和其他共有2.優秀的組合!但我只返回分組字段...

還有一個字段叫做tDate,在H表和p表上的pCode。

現在我試着改變我的選擇是說,但linqpad抱怨m和h變量,因爲我認爲他們不包括在組中......但這是我失去的地方..我該如何返回更多的領域上的小組。當然,pCode和tDate對於組中的每條記錄都是相同的...因此,我仍然應該以2條記錄結尾,但列數更多。

  select 
       new 
       { 
       Group = g.Key, 
       Total = g.Count(), 
       PCode = m.pCode, 
       TDate = h.tDate 
       } 

任何身體給我伸出援助之手....

在此先感謝

回答

1

當您說「進入」時,您從範圍中刪除所有在into之前聲明的變量,並且僅剩下在into之後聲明的變量。

var results = 
    from c in C 
    group c by c.Code into g 
    select new 
    { 
    Group = g.Key, 
    Total = g.Count() 
    } into x 
    from c2 in x 
    join h in h on c2.Group equals h.Code 
    join m in M on c2.Group equals m.Code 
    select new 
    { 
    Group = x.Group, 
    Total = x.Total, 
    PCode = m.pCode, 
    TDate = h.tDate 
    }; 
2

SQL將會給你不被包含在列的錯誤作爲聚合函數的一部分。要包含它們,您必須將它們包括在您的小組中,或重新加入數據以使它們與分組數據相關。

+0

是完全相同,SQL會抱怨部分地由該組中不是選擇部分領域,但是這是我的問題,我不知道如何在LINQ – Martin 2010-11-25 16:37:43

2

我想你需要使用一個聚合函數來獲取值。你有沒有試過h.Max(y => y.tDate)m.First(y => y.pCode)?我認爲這可能會奏效,但我不確定。並非所有函數都是聚合函數。

+0

是最大的作品轉的!我喜歡!但是。首先不。這是一個詭計嗎?良好的做法?我想它背後的規則是,如果沒有特別返回,你只能通過一個組返回聚合函數。因此,做一個Max工作:-)!這是使用最好的方法嗎?我已經嘗試了一些像第一,但不工作... Max採取最大值,但考慮到沒有更多的記錄是否有一種方法來打印的價值?像第一件事 - 但首先不起作用。謝謝 – Martin 2010-11-26 08:20:58

+0

`First`不起作用,因爲它可能不是一個聚合函數,我猜...我只是在猜測那個:)。但在你的情況下,我猜你可以使用`Max`來獲得這兩個值?否則,以下是關於如何編寫自己的聚合函數的舊鏈接:http://blogs.msdn.com/b/jomo_fisher/archive/2005/09/15/467804.aspx。我不確定它是否有效,但你可以嘗試一下。 `First`不是一個竅門,它只是不是一個聚合函數。 – 2010-11-26 08:55:54

0

當然,pCode和tDate對於組內的每條記錄都是相同的。

如果這是真的,你可以讓他們在關鍵的一部分,得到你想要的結果:現在

var results = 
     from c in C 
     join h in H on c.Code equals h.Code 
     join m in M on c.Code equals m.Code 
     group c by new { cCode = c.Code, pCode = m.pCode, tDate = h.tDate } 
      into g 
     select 
      new 
       { 
        Group = g.Key, 
        Total = g.Count() 
       }; 

,例如,你可以說

var firstcCode = results.First().Group.cCode; 
var firstpCode = results.First().Group.pCode; 
var firsttDate = results.First().Group.tDate; 

如果我引用的語句不是,如其他答案中的建議,就像在SQL中一樣,您需要調用一個聚合函數來說明如何處理(可能很多)pCode值給定的cCode

+0

感謝Aajashm,它的工作原理,但關鍵是像一個集合然後..但謝謝 - 它可能會在稍後有用 – Martin 2010-11-26 08:12:45

相關問題