GROUP BY機能を使用したADO.NETの集計関数
-
06-07-2019 - |
質問
これは、以前の以前に私が持っていたより一般的な質問がADO.NETの調査により多くの時間を費やした今
ADO.NET DataTableを取得し、一部の列で集計関数(SUMなど)を使用してSQL SELECTクエリと同等の処理を実行し、残りの列にGROUP BYを設定したい。次に、結果を取得してDataGridに表示します。
フィルター条件と集計関数を含むDataTableのDataViewを作成できることを理解しています。しかし、式のMSDNページには、
"単一のテーブルを使用して集計を作成する場合、グループ化機能はありません。代わりに、すべての行の列に同じ値が表示されます。"
テーブルを別のデータベースに書き込んでクエリを実行せずに、ADO.NETからGROUP BYタイプの機能を取得するにはどうすればよいですか? 2番目のテーブルを作成または使用して、それを行う方法はありますか?
解決
これを行うには、LINQのグループ化機能を使用できます。また、DataGridをLINQクエリにバインドできますが、データは読み取り専用になります。
LINQグループ化のWeb検索により、目的の場所に移動できます。
他のヒント
1つの方法は、リフレクションを使用してlinqクエリの結果をDataTableに変換することです。以下に例を示します。 DataTableを取得すると、完全なグループ化、ページングなどが行われます。
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 .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 /