2014-11-24 2 views
2

У меня есть повторяющийся набор данных, которые я извлекаю из нескольких таблиц SQL (длинная история, но все они имеют разные имена, несмотря на то, что у них одинаковые данные) в .NET DataTable: -Динамический LINQ - Борьба с синтаксисом GROUP BY/SELECT

Point_Date -> Point_Value0 -> Point_Value1 -> Point_Value2 -> Point_ValueX 
24/11/2014 16:18:07 -> 15.1 -> NULL -> NULL 
24/11/2014 16:19:07 -> 15.2 -> NULL -> NULL 
24/11/2014 16:20:07 -> 15.3 -> NULL -> NULL 
24/11/2014 16:18:07 -> NULL -> 16.1 -> NULL 
24/11/2014 16:19:07 -> NULL -> 16.2 -> NULL 
24/11/2014 16:20:07 -> NULL -> 16.3 -> NULL 
24/11/2014 16:18:07 -> NULL -> NULL -> 17.1 
24/11/2014 16:19:07 -> NULL -> NULL -> 17.2 
24/11/2014 16:20:07 -> NULL -> NULL -> 17.3 

Я хочу, чтобы сгруппировать данные на поле даты/времени с помощью LINQ, так что я в конечном итоге с записями, как: -

24/11/2014 16:18:07 -> 15.1 - > 16.1 -> 17.1

Моя проблема в том, что я не знаю, сколько наборов данных будет (есть три в t он пример, но может быть любое число), поэтому мне нужно использовать динамический LINQ.

Я нормально для запроса LINQ для фиксированного числа полей: -

var dtReport = (from row in dtPoints.AsEnumerable() 
       group row by row.Field<DateTime>("Point_Date") 
         into t 
         select new 
         { 
         TempDate = t.Key, 
         Value1 = (double?) t.Sum(r => r.Field<double?>("Point_Value0") ?? 0), 
         Value2 = (double?)t.Sum(r => r.Field<double?>("Point_Value1") ?? 0), 
         Value3 = (double?)t.Sum(r => r.Field<double?>("Point_Value2") ?? 0) 
         }); 

Но у меня настоящая борьба делает его динамическим, используя System.Linq.Dynamic следующее дает мне ошибка: -

 var myRpt2 = dtPoints.AsEnumerable() 
      .AsQueryable() 
      .GroupBy("new (it[\"Point_Date\"] as GrpByCol1)", "it") 
      .Select("new (it.key as TempDate, it.sum(\"Point_Value0\") as SumValue)"); 
  • существо ошибки: -

System.Linq.Dynami c.ParseException {«Нет применимого метода суммирования» sum «существует»}

Я просто не могу понять, как обращаться к полям «Point_Value» после того, как я сделал GroupBy - будет многократная сумма (Point_ValueX) 'в зависимости от количества наборов данных, но я даже не могу заставить его работать в одном поле на данный момент!

Большое спасибо,

David.

+0

Смотреть видео на LINQ по следующему каналу YouTube: https://www.youtube.com/playlist?list=PL6n9fhu94yhWi8K02Eqxp3Xyh_OmQ0Rp6. Особенно часть 18 и 19 ....... – Vishal

+0

Огромный крик спасибо Vishal, высоко оценил :) – DGjuniordev

ответ

2

Я не думаю, что вы можете это сделать. Кажется, что динамический linq не оборудован для анализа выражения, содержащего индекс.

Однако вы можете использовать комбинацию динамической LINQ и регулярные LINQ:

var myRpt2 = (
     dtPoints.AsEnumerable() 
     .AsQueryable() 
     .GroupBy("new (it[\"Point_Date\"] as GrpByCol1)", "it") 
     as IEnumerable<IGrouping<DynamicClass,DataRow>> 
    ) 
    .Select (r => new { ((dynamic)r.Key).GrpByCol1, 
         Sum = r.Sum(x => x.Field<decimal>("Point_Value0"))}); 

Основной поворот является слепок GroupBy результата к IEnumerable<IGrouping<DynamicClass,DataRow>>.

+0

Спасибо, Герт, я бы не знал об этом на группе GroupBy. То, что я до сих пор не вижу, заключается в том, как обрабатывать несколько наборов данных в предложении select, например. где у меня есть Point_Value0 до Point_Value9 ... Я ожидал, что вам нужно будет создать строку и использовать ее в качестве параметра для предложения Select ... есть ли способ сделать это динамически? – DGjuniordev

+0

Это будет сложно. Вам нужно будет создать тип во время выполнения, потому что количество свойств в анонимном типе неизвестно во время компиляции. Возможно, с некоторыми усилиями вы могли бы использовать «ExpandoObject», но я не вижу быстрого/элегантного способа сделать это. –

+0

Еще раз спасибо Gert, на данный момент я прибегал к использованию динамического SQL, с которым мне удобнее (с использованием UNION и динамического выбора/группы), но ваш совет будет полезен в будущем, когда мне будет удобнее LINQ в Генеральная. Приветствия :) – DGjuniordev

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