2

これは、 ADO.NET の調査に多くの時間を費やすようになったため、以前のより一般的な質問に由来する、より直接的な質問です。

ADO.NET DataTable を取得し、一部の列で集計関数 (SUM など) を使用して SQL SELECT クエリと同等の処理を実行し、残りの列に GROUP BY を設定したいと考えています。次に、結果を取得して DataGrid に表示します。

フィルター条件と集計関数を含む DataTable の DataView を作成できることを理解しています。しかし、式に関するMSDNページには、

「単一のテーブルを使用して集計を作成する場合、グループ化機能はありません。代わりに、すべての行が列に同じ値を表示します。」

テーブルを別のデータベースに書き込んでそこでクエリを実行せずに、ADO.NET から GROUP BY 型の機能を取得するにはどうすればよいですか? 2番目のテーブルを作成または使用してそれを行う方法はありますか?

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

これを回避する 1 つの方法は、リフレクションを使用して linq クエリの結果を DataTable に変換することです。ここに例があります。DataTable を取得したら、完全な groupby、ページングなどを使用できます...

    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 に答える