使用GROUP BY功能在ADO.NET中聚合函数

时间:2009-05-06 20:14:02

标签: c# ado.net group-by dataview aggregate-functions

这是一个更直接的问题源于早期more general question i had earlier现在我花了更多时间研究ADO.NET

我想采用ADO.NET DataTable并在某些列上执行与聚合函数(如SUM)相同的SQL SELECT查询,并为其余列设置GROUP BY。然后我想获取结果并将其显示在DataGrid中。

据我所知,我可以创建一个包含过滤条件和聚合函数的DataTable的DataView。但是MSDN page on Expressions

“如果您使用单个表来创建聚合,则不会有分组功能。相反,所有行都会在列中显示相同的值。”

如何在不将我的Table写入单独的数据库并在那里运行查询的情况下从ADO.NET中获取GROUP BY类型功能?有没有办法通过创建或使用第二个表来实现?

4 个答案:

答案 0 :(得分:2)

您可以使用LINQ的分组功能来完成此任务。此外,您可以将DataGrid绑定到LINQ查询,但数据将是只读的。

对LINQ分组进行网络搜索可以帮助您实现目标。

答案 1 :(得分:1)

解决方法之一是使用反射将linq查询结果转换为DataTable。这是一个例子。拥有DataTable后,您将拥有完整的groupby,paging等...

    private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        // if data is empty, return an empty table
        if (data.Length == 0) return dt;

        Type t = data[0].GetType();
        System.Reflection.PropertyInfo[] piList = t.GetProperties();

        foreach (System.Reflection.PropertyInfo p in piList)
        {
            dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
        }

        object[] row = new object[piList.Length];

        foreach (object obj in data)
        {
            int i = 0;
            foreach (System.Reflection.PropertyInfo pi in piList)
            {
                row[i++] = pi.GetValue(obj, null);
            }
            dt.Rows.Add(row);
        }

        return dt;
    }

    internal static DataTable GetAllStoredFileDetailsByUserID(int userID)
    {
        var db = GetDataContext();
        object[] result;
        try
        {
            result = (from files in db.Files
                      where files.OwnerUserID == userID && files.IsThumbnail == false
                      select new
                      {
                          FileID = files.FileID,
                          Name = files.Name,
                          DateCreated = files.DateCreated,
                          Size = files.Size,
                          FileHits = (from act in db.FileWebActivities where act.FileID == files.FileID select act).Count()
                      }).ToArray();
        }
        catch (Exception)
        {
           //omitted
        }
        return ObjectArrayToDataTable(result);
    }

答案 2 :(得分:1)

以下是使用.NET 3.x及更高版本(LINQ)的方法:

http://codecorner.galanter.net/2009/12/17/grouping-ado-net-datatable-using-linq/

这是如何使用.NET 2.0及以下版本(标准ADP.NET)

http://codecorner.galanter.net/2009/04/20/group-by-and-aggregates-in-net-datatable/

答案 3 :(得分:0)