0

私が持っているいくつかのSQLをいくつかのlinqに変換しようとしていますが、問題があります。

MfrID、CatID、Count と呼ぶ 3 つの列を持つテーブルがあります。

いくつかのメソッドに CatID のリストを与えることができるようにしたいのですが、それはテーブルを通過し、そのリストに CatID を含むすべての MfrID とカウントを見つけ、mfrID が等しい場所でカウントを合計して、テーブルを並べ替えます。新しい TotalCounts によって、上位 X 件の結果を返します。

これはコードで説明するのが一番だと思います。これは私が解決しようとしているサンプルテストです

     [TestMethod]
    public void tempFiguringOutLinqQuery()
    {
        //some example data of what a sql table could look like
        var sampleData = new []
            {
                new {MfrId = 1, CatId = 1, MfrCount = 3},
                new {MfrId = 1, CatId = 2, MfrCount = 1},
                new {MfrId = 5, CatId = 1, MfrCount = 2},
                new {MfrId = 5, CatId = 6, MfrCount = 20},
                new {MfrId = 3, CatId = 5, MfrCount = 14},
                new {MfrId = 3, CatId = 2, MfrCount = 7},
                new {MfrId = 3, CatId = 1, MfrCount = 9},
                new {MfrId = 2, CatId = 1, MfrCount = 1}
            }.ToList();

        var catList = new List<int> {1, 2};

        //where CatIDList.Contains(1 or 2), Add MfrCount where MfrIds are equal, then take the top 3 results ordered by mfrCountDescending
        //ughhhhh
        var results = sampleData.Where(w => catList.Contains(w.CatId)).GroupBy(g => g.MfrCount); 

        //expected results
        // { MfrId = 3, MfrCount = 16 }
        // { MfrId = 1, MfrCount = 4 }
        // { MfrId = 5, MfrCount = 2 }
        Assert.Inconclusive();
    }
4

2 に答える 2

2

最も簡単な方法は、メーカー ID でグループ化し、各グループに変換を適用することです。間違ったフィールドでグループ化し、変換を逃しただけで、ほぼそこにいました。たとえば、並べ替えと「上位 3 の取得」を含めると、次のようになります。

var results = sampleData.Where(w => catList.Contains(w.CatId))
                        .GroupBy(w => w.MfrId) // Not MfrCount!
                        .Select(g => new { MfrId = g.Key,
                                           MfrCount = g.Sum(x => x.MfrCount) })
                        .OrderByDescending(x => x.MfrCount)
                        .Take(3);

いずれにせよ、実際にはグループ射影を取るオーバーロードがありますが、個人的には、分離されGroupByたバージョンの方が読みやすいと思います。Select

于 2013-08-02T16:32:08.160 に答える
1

フィルター処理されたデータを(グループ キーとなる) でグループ化し、各グループMfrIdの合計を計算します。MfrCount

var query = from d in sampleData
            where catList.Contains(d.CatId)
            group d by d.MfrId into g
            select new {
               MfrId = g.Key,
               MfrCount = g.Sum(x => x.MfrCount)
            };

var result = query.OrderByDescending(x => x.MfrCount).Take(3);

または流暢な構文で:

var result = sampleData.Where(d => catList.Contains(d.CatId))
                       .GroupBy(d => d.MfrId)
                       .Select(g => new {
                           MfrId = g.Key,
                           MfrCount = g.Sum(x => x.MfrCount)
                       })
                       .OrderByDescending(x => x.MfrCount)
                       .Take(3);

結果:

{ MfrId = 3, MfrCount = 16 }
{ MfrId = 1, MfrCount = 4 }
{ MfrId = 5, MfrCount = 2 }

Take(3)編集:クエリに追加された上位 3 つの結果のみが必要であることを見逃しました。

于 2013-08-02T16:31:55.267 に答える