在没有LINQ的情况下聚合DataTable

时间:2017-07-05 11:17:05

标签: c# sql-server linq datatable

我想根据一些不同的值聚合数据表行。我必须使用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()的示例以及用于在数据表中聚合和分组数据的其他相关源,但它只返回一个对象值,它对于对数据表中的行进行分组没有用。在我的问题中,用户决定在运行时使用summinmax或...,并且我试图找到创建一些动态查询的解决方案。< / p>

2 个答案:

答案 0 :(得分:0)

您应该使用Dynamic LINQ。它允许您根据字符串输入执行LINQ。

enter image description here

答案 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();
        }
    }
}