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

C# 使用GROUP BY功能在ADO.NET中聚合函数,c#,ado.net,group-by,dataview,aggregate-functions,C#,Ado.net,Group By,Dataview,Aggregate Functions,这是一个更直接的问题,源于之前的一个问题,因为我花了更多的时间研究ADO.NET 我想获取一个ADO.NET数据表,并对某些列使用聚合函数(如SUM)执行与SQL SELECT查询等效的查询,对其余列使用GROUP BY set。然后我想获取结果并将其显示在数据网格中 我知道我可以创建包含筛选条件和聚合函数的DataTable的DataView。但是政府说 如果使用单个表创建聚合,则不会有分组依据功能。相反,所有行在列中显示相同的值 如何从ADO.NET中获得按类型分组功能,而无需将表写入单独的

这是一个更直接的问题,源于之前的一个问题,因为我花了更多的时间研究ADO.NET

我想获取一个ADO.NET数据表,并对某些列使用聚合函数(如SUM)执行与SQL SELECT查询等效的查询,对其余列使用GROUP BY set。然后我想获取结果并将其显示在数据网格中

我知道我可以创建包含筛选条件和聚合函数的DataTable的DataView。但是政府说

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


如何从ADO.NET中获得按类型分组功能,而无需将表写入单独的数据库并在其中运行查询?有没有办法通过创建或使用第二个表来实现这一点?

您可以使用LINQ的分组功能来实现这一点。此外,您可以将DataGrid绑定到LINQ查询,但数据将是只读的


对LINQ分组的web搜索应该可以帮助您找到要去的地方。

一种解决方法是使用反射将LINQ查询结果转换为数据表。这里有一个例子。一旦有了DataTable,就有了完整的groupby、分页等功能

    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);
    }

以下是如何使用.NET 3.x及更高版本(LINQ)进行此操作:

这是如何使用.NET2.0及以下版本(标准ADP.NET)实现的


啊,我在想林克可能是答案。如果数据是只读的,这不是问题。谢谢仅仅指定URL并不是一个答案。今后请避免这样做。