使用 GROUP BY 功能在 ADO.NET 中聚合函数
Posted
技术标签:
【中文标题】使用 GROUP BY 功能在 ADO.NET 中聚合函数【英文标题】:Aggregate functions in ADO.NET with GROUP BY functionality 【发布时间】:2010-10-24 07:25:55 【问题描述】:这是一个更直接的问题,源于较早的more general question i had earlier,现在我花了更多时间研究 ADO.NET
我想获取一个 ADO.NET 数据表,并在某些列上使用聚合函数(例如 SUM)执行 SQL SELECT 查询,并为其余列设置 GROUP BY。然后我想获取结果并将其显示在 DataGrid 中。
我知道我可以创建包含过滤条件和聚合函数的 DataTable 的 DataView。但是MSDN page on Expressions 这么说
“如果您使用单个表来创建聚合,则没有分组功能。相反,所有行将在列中显示相同的值。”
如何在不将我的表写入单独的数据库并在那里运行查询的情况下从 ADO.NET 中获得 GROUP BY 类型功能?有没有办法通过创建或使用第二个表来做到这一点?
【问题讨论】:
【参考方案1】:您可以使用 LINQ 的分组功能来完成此操作。此外,您可以将 DataGrid 绑定到 LINQ 查询,但数据将是只读的。
对 LINQ 分组的网络搜索应该可以帮助您找到目标。
【讨论】:
啊,我在想 LINQ 可能是答案。如果数据是只读的,这不是问题。谢谢!【参考方案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/
【讨论】:
【参考方案3】:解决它的一种方法是使用反射将您的 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);
【讨论】:
【参考方案4】:http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on-net-2-0.aspx
【讨论】:
只指定 URL 不是答案。请在未来避免这种情况。以上是关于使用 GROUP BY 功能在 ADO.NET 中聚合函数的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?