2015-01-18 5 views
0

У меня есть этот код здесь:LINQ группы по с агрегатной функцией (метод синтаксис)

Dim result As IEnumerable(Of Object()) 
Dim dt As New DataTable 
Dim indexes As New List(Of Integer) 
Dim groupedindexes As New List(Of Integer) 
Dim datarows As New List(Of DataRow) 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    dt.Columns.Add("f1", Type.GetType("System.Char")) 
    dt.Columns.Add("f2", Type.GetType("System.Char")) 
    dt.Columns.Add("f3", Type.GetType("System.Char")) 
    dt.Columns.Add("f4", Type.GetType("System.Int32")) 
    For i = 0 To 100 
     dt.Rows.Add("a", "b", "c", i * 2) 
    Next 

    indexes.Add(0) 
    indexes.Add(1) 
    indexes.Add(2) 
    indexes.Add(3) 

    groupedindexes.Add(0) 
    groupedindexes.Add(1) 
    groupedindexes.Add(2) 

    For i = 0 To dt.Rows.Count - 1 
     datarows.Add(dt.Rows(i)) 
    Next 

    result = datarows.Select(Function(row) indexes.Select(Function(index) row(index)).ToArray) 
    'select sum(f4), f1, f2, f3 from t1 group by f1, f2, f3 
    Dim test = result.GroupBy(Function(Key) groupedindexes.Select(Function(groupedindex) Key(groupedindex)).ToArray, 
           Function(Result) indexes.Select(Function(index) Result(index)).ToArray) 

End Sub 

Я пытаюсь группа по методу/функции. С приведенным выше кодом мне удается получить результат теста, сгруппированный по f1, f2 и f3. Теперь я хотел бы реализовать функцию суммы, как и SQL-запрос сказал:

select sum(f4), f1, f2, f3 from t1 group by f1, f2, f3 

Я пытался что-то вроде этого:

Dim test = result.GroupBy(Function(Key) groupedindexes.Select(Function(groupedindex) Key(groupedindex)).ToArray, 
          Function(Result) indexes.Select(Function(index) Result(index)).ToArray).Select(
          Function(groupedrow) New With 
               {Key .sum_of_f4 = groupedrow.Sum(Function(row) Convert.ToInt32(row(3))), 
               Key .f1 = groupedrow.Key(0), 
               Key .f2 = groupedrow.Key(1), 
               Key .f3 = groupedrow.Key(2)}) 

Но f4 не суммируется, я получаю все 101 строк ,

Как исправить мой код, чтобы получить желаемый результат?

ответ

0

Я не совсем понимаю, что вы пытаетесь сделать с выражением «тест», но если SQL упомянуто должно быть достигнуто, я думаю, простой запрос, как это нужно сделать:

Dim Result = (
    From i in dt.Rows 
    Group By f1 = i("f1"), f2 = i("f2"), f3 = i("f3") 
    Into f4 = Sum(i("f4")) 
    ).ToList 

UPDATE: мЕТОД сИНТАКСИС

Dim Data = datarows.GroupBy(Function(x) New With {Key .f1 = x("f1"), Key .f2 = x("f2"), Key .f3 = x("f3")}).Select(Function(x) New With {.f1 = x(0)("f1"), .f2 = x(0)("f2"), .f3 = x(0)("f3"), .f4 = x.Sum(Function(i) i(3))}).ToList 
+0

Но это не метод синтаксиса на одной стороне, на другой я думаю, я описал проблему достаточно детализированы. Я просто хочу интегрировать функцию sum (или другую агрегатную функцию) в последнем кодеблоке. – derstauner

+0

@derstauner, я добавил тот же запрос в синтаксисе метода к моему ответу. Надеюсь, это сработает для вас. – CrimsonKing

+0

Пожалуйста, внимательно прочитайте вопрос. У меня уже есть функция sum в запросе, но моя проблема в том, что значения f4 не суммируются. Вы можете попробовать, если вы скопируете и вставьте код по сравнению с – derstauner

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