这是一个更直接的问题源于早期的我之前提到的更一般的问题现在我花了更多的时间研究ADO.NET

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

据我所知,我可以创建一个包含过滤条件和聚合函数的DataTable的DataView。但关于表达式的MSDN页面

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

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

有帮助吗?

解决方案

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

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

其他提示

解决方法之一是使用反射将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);
    }

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

http://codecorner.galanter达网络/ 2009/12/17 /分组-ADO净数据表-使用-LINQ /

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

的方法

http:// codecorner .galanter.net / 2009/04/20 /组按和聚集体 - 在净数据表/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top