4

私はデータテーブルを持っています

ID  Age Last name   First Name  Sex class   Father_Name Mother_Name Marks
1   20  A   B   M   1   A   B   50
1   20  A   B   M   1   A   B   50
1   20  A   B   M   1   A   B   100
2   15  F   G   F   2   H   J   40
2   15  F   G   F   2   H   J   50

&Linq Groupを適用した後、次の結果が必要です

1   20  A   B   M   1   A   B   200
2   15  F   G   F   2   H   J   90

合計を取得できますが、LINQ グループの他の列を取得できません

誰でもこれを手伝ってもらえますか

var drResults = from r1 in dtResults.AsEnumerable()
                            group r1 by new 
                                {
                                   MarksSum=  r1.Field<int>("Marks"),

                                }
                                into g
                            select new
                            {


                                    Total = g.Sum(r1=>r1.Field<int>("Marks"))                                   
                            };
4

3 に答える 3

7
var _result =   from r1 in dtResults.AsEnumerable()
                group r1 by new
                {
                    ID = r1.Field<int>("ID"),
                    Age = r1.Field<int>("Age"),
                    LastName =  r1.Field<int>("LastName"),
                    FirstName = r1.Field<int>("FirstName"),
                    Sex =  r1.Field<int>("Sex"),
                    Class =  r1.Field<int>("class"),
                    Father_Name =  r1.Field<int>("Father_Name"),
                    Mother_Name =  r1.Field<int>("Mother_Name")
                } into g
                select new
                {
                    ID = g.Key.ID,
                    Age = g.Key.Age,
                    LastName =  g.Key.LastName,
                    FirstName = g.Key.FirstName,
                    Sex =  g.Key.Sex,
                    Class =  g.Key.Class,
                    Father_Name =  g.Key.Father_Name,
                    Mother_Name =  g.Key.Mother_Name,
                    TotalMark = g.Sum(x => x.Field<int>("Marks"))
                };
于 2013-03-16T10:44:02.940 に答える
4

Id?!でグループ化したい Sum次に、Marksグループでを使用できます。

var result = from r in dtResults.AsEnumerable()
             group r by r.Field<int>("ID") into IdGroup
             let row = IdGroup.First()
             select new
             {
                 ID = IdGroup.Key,
                 Age = row.Field<int>("Age"),
                 LastName = row.Field<string>("Last_Name"),
                 FirstName = row.Field<string>("First_Name"),
                 MotherName = row.Field<string>("Mother_Name"),
                 FatherName = row.Field<string>("Father_Name"),
                 Marks = IdGroup.Sum(r => r.Field<int>("Marks"))
             };

アップデート

ティムさん、すべての行の値が異なる場合はどうすればよいですか? たとえば、LastName が異なり、ID が同じです。破損しているデータがあるか、冗長であると言えます。

を「修復」する方法を示すことは、この質問の範囲外ですDataTable。しかし、同じ ID を持っていてもすべての行をリストしたいが、IDMarkグループごとに正確に合計したい場合は、次のクエリを使用できます。

var result = from r in dtResults.AsEnumerable()
             group r by r.Field<int>("ID") into IdGroup
             let IdTotalMarks = IdGroup.Sum(r => r.Field<int>("Marks"))
             from row in IdGroup
             select new
             {
                 ID = IdGroup.Key,
                 Age = row.Field<int>("Age"),
                 LastName = row.Field<string>("Last Name"),
                 FirstName = row.Field<string>("First Name"),
                 MotherName = row.Field<string>("Mother Name"),
                 FatherName = row.Field<string>("Father_Name"),
                 Marks = IdTotalMarks
             };
于 2013-03-16T10:45:12.277 に答える
1

ラムダ構文を使用したJWの回答(これはコンパイルされないため、フィールド「クラス」の名前も変更しました):

       var _result = dtResults
            .AsEnumerable()
            .GroupBy(r1 => new
            {
                ID = r1.Field<int>("ID"),
                Age = r1.Field<int>("Age"),
                LastName =  r1.Field<string>("LastName"),
                FirstName = r1.Field<string>("FirstName"),
                Sex =  r1.Field<int>("Sex"),
                Class =  r1.Field<int>("class"),
                Father_Name =  r1.Field<string>("Father_Name"),
                Mother_Name =  r1.Field<string>("Mother_Name")
            }).Select(g => new
            {
                ID = g.Key.ID,
                Age = g.Key.Age,
                LastName =  g.Key.LastName,
                FirstName = g.Key.FirstName,
                Sex =  g.Key.Sex,
                Class =  g.Key.Class,
                Father_Name =  g.Key.Father_Name,
                Mother_Name =  g.Key.Mother_Name,
                TotalMark = g.Sum(x => x.Field<int>("Marks"))
            });
于 2013-03-16T11:12:47.320 に答える