2013-06-20 48 views
1

我不知道我如何正確字的問題,但有:的Linq組由多個列與列匿名

  var groups = data.GroupBy(x => new {x.EntityId, x.StartLocal = new { 
       var stamp = x.StartLocal; 
       stamp = stamp.AddHours(-(stamp.Hour % hours)); 
       stamp = stamp.AddMinutes(-stamp.Minute); 
       stamp = stamp.AddMilliseconds(-stamp.Millisecond); 
       return stamp; 
      }}) 
.Select(...) 
      .ToList(); 

它不工作(語法錯誤)。我想首先由entityId組,然後由一個名爲StartLocal,就像如果我是組的結果通過每2個小時,我會得到場的時間:

Id = 1 
    Hour = 2 
    Hour = 4 
Id = 2 
    Hour = 2 
... 

像這樣。

我需要填寫:

 DO obj = new DO 
     { 
      EntityId = pp.EntityId, 
      EntityCode = pp.EntityCode, 
      StartLocal = pp.StartLocal, 
      Volume = pp.Volume, 
     }; 

Volume是需要被聚集的內容。因此,基本上有1000個這樣的DO會以數組的形式出現,然後它們被EntityId分割,然後在StartLocal的小時內分割......音量累積x小時值,並創建相同的DO ...但現在多了更少。

+0

剛剛這樣做。 – sprocket12

+0

所以「錯誤的語法」是錯誤信息? –

+0

沒有它更多與如何聲明匿名類型有關,但它不值得引用,因爲真正的問題是我不知道如何聲明第二列由不只是由x.Property組成。 – sprocket12

回答

0

好像你想是這樣的:

var groups = data.GroupBy(x => 
    { 
     var stamp = x.StartLocal; 
     stamp = stamp.AddHours(-(stamp.Hour % hours)); 
     stamp = stamp.AddMinutes(-stamp.Minute); 
     stamp = stamp.AddMilliseconds(-stamp.Millisecond); 
     return new { x.EntityId, StartLocal = stamp }; 
    }); 

或者更簡單地說:

var groups = data.GroupBy(x => new 
    { 
     x.EntityId, 
     StartLocal = new DateTime(
      x.StartLocal.Year, 
      x.StartLocal.Month, 
      x.StartLocal.Day, 
      x.StartLocal.Hour % hours, 0, 0) 
    }); 

這些都給予StartLocal四捨五入到一個小時。如果你本身只想小時,你可以這樣做:

var groups = data.GroupBy(x => new { x.EntityId, x.StartLocal.Hour % hours }); 
+0

嗨p.s.w.g似乎你的第一個解決方案並不是通過entityId進行分組,而第二個方案並沒有給予細粒度控制,例如我想在一個小時內以int的形式傳遞,並通過它進行分組。 – sprocket12

+0

@MuhammadA第一種解決方案通過'EntityId'進行分組,(參見代理'new {x.EntityId,x.StartLocal = stamp}''中的最後一行)。第二個給'x.StartLocal'四捨五入到小時。如果你想要的只是一個'int'小時,請參閱我的最新更新。 –

0

你應該解釋爲什麼你想在更高層次上的事情。可能有其他(更好的)方法來完成你想要做的事情。

根據你在做什麼來判斷,它在我看來就像你只是試圖按他們的ID和它開始的日期和小時來分組項目。您不需要嘗試創建單個DateTime對象來表示日期和小時,只需單獨獲取組件即可。此外,您的查詢提供程序可能不支持複雜的選擇器,這看起來不像LINQ來查詢對象。

只是這樣做:

var groups = data.GroupBy(x => new 
    { 
     x.EntityId, 
     StartDate = x.StartLocal.Date, 
     StartHour = x.StartLocal.Hour, 
    }) 
    .Select(...) 
    .ToList(); 
0

你真正需要的是在這裏要呼籲GroupBy,而不是單一的通話一個複雜的對象分組。

var query = data.GroupBy(item => item.EntityId) 
    .Select(group => group.GroupBy(item => item.StartLocal)); 

這會爲您提供深度爲3的樹,而不是兩組或換句話說組的組。