2013-02-19 5 views
0

Edit 3: Improved формулировка вопроса и примерыметод, который принимает LINQ IGrouping как параметр

У меня есть следующий Linq запрос, который использует группировку. Операции группировки и выбора сложны, поэтому я абстрагировал один из вариантов выбора метода, который делает некоторые варианты того, как визуализировать данные.

Мой запрос корректно работает внутри определения анонимной группы, но как только я набираю его для класса, чтобы передать его методу в качестве объекта группировки, он перестает группировать результаты.

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

«Не работает» не является описанием ошибки. Пожалуйста, объясните, что происходит. Если вы получили сообщение об ошибке, опубликуйте его. Если вы не получите желаемый результат, опубликуйте ожидаемый и фактический результат. –

+0

Ваш код в этом вопросе не соответствует коду в файле, на который вы ссылаетесь. – juharr

+0

@ DanielHilgarth Извините, не был достаточно явным. Код компилируется и запускается, но группировка не работает должным образом. На самом деле, он вообще не работает, и я возвращаю все строки – amhed

ответ

2

В первом случае группа анонимным типа, генерируется компилятором. Этот тип также сгенерировал переопределения Equals и HashCode (вы можете проверить его с помощью ildasm). Анонимный тип по умолчанию. Equals запускает сопоставитель сравнений для каждого поля. Я думаю, что это было сделано для использования в подобных случаях.

Во втором случае вы группируете свой собственный тип. Так как это ссылочный тип, сравнительный сравнитель по умолчанию сравнивает объекты по ссылке. Поскольку перед группировкой вы создаете последовательность объектов, каждая из них уникальна. Поэтому проверка равенства по умолчанию считает, что они отличаются.

Решения (выбрать любой):

  1. Override Равно и HashCode.
  2. Марка типа struct вместо class

Будьте осторожны и, не забудьте осуществить Hashcode, а также.

Смежные вопросы