0

ひどいタイトルで申し訳ありません。使用する正しい用語がわかりません。

私は単純なテーブル(マテリアルと呼ばれる)を持っています:

Id       int
Desc     Varchar(50)
MainType Varchar(20)
SubType  Varchar(20)

いくつかのサンプルデータ:

ID     Desc                    Maintype     SubType
1      Aluminium 3003          Metal        Aluminium
2      Bamboo                  Wood         Softwood
3      Cellulose Acetate       Polymer      CA
4      Cork                    Wood         Composite
5      Stainless Steel         Metal        Steel
6      Tinplate                Metal        Steel
7      PA (Type 11, Unfilled)  Polymer      PA
8      PA (Type 12, Unfilled)  Polymer      PA
9      PA (Type 46, Extrusion) Polymer      PA
10     Palm                    Wood         Softwood

次のように、データセット内の各マテリアルのメインタイプとサブタイプの出現回数を含む (グループ化されていない) マテリアルの順序付けられた (メインタイプ、サブタイプによる) リストが必要です。

ID     Desc                    Maintype     SubType    CountMain   CountSub
1      Aluminium 3003          Metal        Aluminium  3           1
5      Stainless Steel         Metal        Steel      3           2
6      Tinplate                Metal        Steel      3           2
3      Cellulose Acetate       Polymer      CA         4           1
7      PA (Type 11, Unfilled)  Polymer      PA         4           3
8      PA (Type 12, Unfilled)  Polymer      PA         4           3
9      PA (Type 46, Extrusion) Polymer      PA         4           3
4      Cork                    Wood         Composite  3           1
2      Bamboo                  Wood         Softwood   3           2
10     Palm                    Wood         Softwood   3           2

SQLでは、これは面倒です:

SELECT Id
      ,MaterialName
      ,MaterialType
      ,MaterialSubType
      ,(select count(id) from materials m2 where m2.materialType=m1.materialType) as CountMain
      ,(select count(id) from materials m2 where m2.materialSubType=m1.materialSubType) as CountSub
  FROM materials m1
  order by materialType, MaterialSubType 

ただし、Linq では、それに近づくことはできません。これは、私が vb を使用していて、group と into に構文上の問題があるためかもしれません。「グループ」、「イント」、「カウント」によって引き起こされる厄介な文脈上の問​​題を解決できないため、linq 式をきれいにコンパイルすることさえできません。「カウント」結果に使用するサブクエリの正しい技術用語がわからないため、これを行う例が見つかりません。やり方が悪いからかも!

linqクエリを理解している人にとっては非常に簡単だと確信しています-オンラインチュートリアルまたはこれを達成する方法を示す何かがあれば、ポインタまたはLINQでこれを行う方法の簡単な説明をいただければ幸いです.

4

1 に答える 1

0

Sods法、私はそれを投稿した直後にそれを解決しました!

from mat in materials 
order by mat.mainType, mat.subType
select new with {
    mat.Id,
    mat.MaterialName,
    mat.MainType,
    mat.SubType,
    .countMain = (Aggregate m2 in materials
                    where m2.MainType=mat.MainType
                    into Count()),
    .countSub = (Aggregate m2 in materials
                    where m2.SubType=mat.SubType
                    into Count())
}
于 2013-10-03T10:04:30.077 に答える