这是一个更直接的问题源于早期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类型功能?有没有办法通过创建或使用第二个表来实现?
答案 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)