2

这是一个更直接的问题,源于我之前提出的一个更普遍的问题,现在我花了更多时间研究 ADO.NET

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

我知道我可以创建包含过滤条件和聚合函数的 DataTable 的 DataView。但是表达式上的 MSDN 页面

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

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

4

4 回答 4

2

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

对 LINQ 分组的 Web 搜索应该可以让您找到您要去的地方。

于 2009-05-06T20:55:55.183 回答
2

以下是使用 .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/

于 2010-11-05T13:41:21.017 回答
1

一种解决方法是使用反射将您的 linq 查询结果转换为 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);
    }
于 2009-05-06T21:10:23.060 回答
0

http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on-net-2-0.aspx

于 2009-10-12T12:49:50.413 回答