我想根据一些不同的值聚合数据表行。我必须使用Select和Compute方法或其他非linq方法。 我的问题是:我如何聚合(sum,count,min和...)和分组字段,并获得与sql server表一样的结果。考虑我有一个包含四列a,b,c,d的表。当我想基于'b聚合'a'时,我可以写:
Select sum(a) as 'a', b
from myTable
group by b
并且sql sever创建了一个包含两列“a”和“b”的表,那么如何在C#中使用DataTables
呢?
我在MSDN中看到了DataTable.Compute()
的示例以及用于在数据表中聚合和分组数据的其他相关源,但它只返回一个对象值,它对于对数据表中的行进行分组没有用。在我的问题中,用户决定在运行时使用sum
,min
,max
或...,并且我试图找到创建一些动态查询的解决方案。< / p>
答案 0 :(得分:0)
您应该使用Dynamic LINQ。它允许您根据字符串输入执行LINQ。
答案 1 :(得分:-1)
请尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication64
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("a", typeof(int));
dt.Columns.Add("b", typeof(string));
dt.Columns.Add("c", typeof(string));
dt.Columns.Add("d", typeof(string));
dt.Rows.Add(new object[] { 1, "b1", "c", "d" });
dt.Rows.Add(new object[] { 2, "b1", "c", "d" });
dt.Rows.Add(new object[] { 3, "b1", "c", "d" });
dt.Rows.Add(new object[] { 4, "b2", "c", "d" });
dt.Rows.Add(new object[] { 5, "b2", "c", "d" });
dt.Rows.Add(new object[] { 6, "b3", "c", "d" });
dt.Rows.Add(new object[] { 7, "b4", "c", "d" });
var results = dt.AsEnumerable().GroupBy(x => x.Field<string>("b")).Select(x => new { key = x.Key, sum = x.Sum(y => y.Field<int>("a"))}).ToList();
}
}
}