2013-02-19 123 views
0

編輯3:改進的問題措辭和實施例方法,其接收LINQ IGrouping作爲參數

我有一個使用分組下面LINQ查詢。分組和選擇操作很複雜,所以我將其中一個選擇抽象爲一個方法,該方法對如何呈現數據做出了一些選擇。

我的查詢在匿名組定義中正常工作,但只要我將它鍵入到類中以便將其作爲IGrouping對象傳遞給方法,就會停止對結果進行分組。

public class TestController : Controller 
{ 
    public JsonResult ThisWorks() 
    { 
     var valueList = DataMocker.GetTestValues(); 

     var group = from v in valueList.AsEnumerable() 
        where (v.Data != 0) 
        group v by new 
            { 
             Year = v.Fecha.Value.Year, 
             Trimester = string.Empty, 
             Month = v.Fecha.Value.Month, 
             Day = 0, 
            } 
         into g 
         select new SeriesDataPoint 
                { 
                 y = g.OrderByDescending(obd => obd.Fecha) 
                    .Select(obd => obd.Data.Value) 
                    .FirstOrDefault(), 

                 color = "black", 
                 month = g.Key.Month, 
                 year = g.Key.Year, 
                 seriesName = "Test Series", 
                }; 

     return Json(group, JsonRequestBehavior.AllowGet); 
    } 

    public JsonResult ThisDoesnt() 
    { 
     var valueList = DataMocker.GetTestValues(); 

     var group = from v in valueList.AsEnumerable() 
        where (v.Data != 0) 
        group v by new Models.SeriesResultGroup 
        { 
         Year = v.Fecha.Value.Year, 
         Trimester = string.Empty, 
         Month = v.Fecha.Value.Month, 
         Day = 0, 
        } 
         into g 
         select new SeriesDataPoint 
         { 
          y = RenderDataPoint(valueList, g), 
          color = "black", 
          month = g.Key.Month, 
          year = g.Key.Year, 
          seriesName = "Test Series", 
         }; 

     return Json(group, JsonRequestBehavior.AllowGet); 
    } 

    public static decimal? RenderDataPoint(List<Models.ValoresResultSet> valores, IGrouping<Models.SeriesResultGroup, Models.ValoresResultSet> group) 
    { 
     return group.OrderByDescending(obd => obd.Fecha) 
        .Select(obd => obd.Data.Value) 
        .FirstOrDefault(); 
    } 
} 
+1

「不工作」不是錯誤描述。請解釋發生了什麼。如果您收到錯誤消息,請將其發佈。如果你沒有得到想要的結果,請發佈預期結果和實際結果。 – 2013-02-19 21:10:19

+0

您在此問題中的代碼與您鏈接到的文件中的代碼不匹配。 – juharr 2013-02-19 21:17:23

+0

@DanielHilgarth對不起,不夠明確。代碼編譯並運行,但分組無法按預期工作。事實上,它根本不起作用,我得到所有的行 – amhed 2013-02-19 21:19:35

回答

2

在第一種情況下,你組由匿名類型,由編譯器生成。這種類型也產生了Equals和HashCode覆蓋(你可以通過ildasm來檢查它)。匿名類型的默認Equals爲每個字段運行相等比較器。我認爲這是爲了在這種情況下使用。

在第二種情況下,您按自定義類型進行分組。由於它是引用類型,因此默認的相等比較器通過引用來比較對象。因爲在分組之前,你會產生一系列對象,每個對象都是唯一的。所以默認的平等檢查認爲他們不同。

解決方案是:(任意選擇):

  1. 覆蓋equals和hashCode。
  2. 制式struct而不是class

要小心,不`噸忘記實現的hashCode爲好。