LINQ group by 使用聚合函数(方法语法)
LINQ group by with an aggregate function (method syntax)
我这里有这段代码:
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
我正在尝试 method/function 的群组。通过上面的代码,我设法得到了一个测试结果,按 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 行。
我应该如何更正我的代码以获得期望的结果?
我不太明白你想用 "test" 表达式做什么,但如果要实现提到的 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
更新:方法语法
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
我这里有这段代码:
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
我正在尝试 method/function 的群组。通过上面的代码,我设法得到了一个测试结果,按 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 行。
我应该如何更正我的代码以获得期望的结果?
我不太明白你想用 "test" 表达式做什么,但如果要实现提到的 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
更新:方法语法
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