2017-03-29 10 views
3

1対多関係のあるDBテーブル[Table1]があります。
この関連表[Table2]は文字列であるタイプフィールドを持っています。 linq-to-SQLグループを結合テーブルの文字列のリストで表示

 
Table 1   Table 2 
Field | Type  Field | Type 
------|-----  ---------|----- 
Id | int  Id  | int 
       Table1Id | int 
       Type  | string 

私は種類の組み合わせごとに、 の発生頻度の要約を作成しようとしていますし、メモリにすべてを持って来るには余りにも遅いできるだけDB上のように多くの作業を行うにしようとしています。

私のコードは動作していますが、私にとっては繰り返しのようです。私はDB上のグループ化を行い、また、私のコードでselect文の数を減らすことができるように

 items 
     .Where(x => x.Table2s.Count > 1) 
     .Select(x => new 
     { 
      Type = x.Table2s.Select(y => y.Type) 
     }) 
     .ToList() // into memory as string.join has no translation into sql 
     .Select(x => new 
     { 
      Type = string.Join(",", x.Type) // no sql translation 
     }) 
     .GroupBy(x => x.Type) // can't work on IEnumerable[string] 
     .Select(x => new Result() 
     { 
      Type = x.Key, 
      Count = x.Count() 
     }) 
     .OrderByDescending(x => x.Count) 
     .ToList(); 

は、文字列のリストによってグループ化する方法はあります

+1

を(あなたが孤児表2のエントリを持っている可能性がある場合は参加半残ってやって)それ?同じフィールド定義を持つタイプの重複を検出しようとしていますか? –

+0

@ JeroenvanLangen申し訳ありませんが、table1のレコードが表2の各組み合わせにリンクされた回数を表示しようとしています。 タイプa、b、c = 5 |タイプa、c = 10 |型d、f = 1 –

+0

フラグ付き列挙型の型要素を作るためにint型フィールドを 'Table 1'に追加することができます。次に、それらの合計でグループ化することができます。 –

答えて

0

LINQのSQLに対応していません。 AggregateまたはString.Joinまたはそれに対応するSQLトリックであるため、ストアドプロシージャを使用しない限り、クライアント側で作業が行われる必要があります。

代わりに、グループ化を最初に作成してからサーバーに送って一致を数えることもできますが、それは利益のようには見えません。

私はあなたができる最善のは、私がitemグループ化されたときに彼らが合っているでしょうに属するType Sを命じ

var sqlans = items.Where(x => x.Table2s.Count > 0).AsEnumerable(); 
var ans = sqlans.Select(x => String.Join(",", x.Table2s.Select(t2 => t2.Type).OrderBy(ty => ty).ToArray())).GroupBy(ty => ty, ty => ty, (key, g) => new { key, Count = g.Count() }); 

のようなものだと思います。 sqlans部分はサーバーによって実行されますが、残りはString.Joinを処理するためにクライアント上で実行する必要があります。代わりに、表2で動作するように私が誘惑されるだろうEFを使用しての

なぜ `String.Join()`すべてのタイプとグループがあり、直接

var sqlans = Table2.GroupBy(t2 => t2.Table1Id, t2 => t2.Type, (key, g) => g).AsEnumerable(); 
var ans = sqlans.Select(x => String.Join(",", x.OrderBy(ty => ty).ToArray())).GroupBy(ty => ty, ty => ty, (key, g) => new { key, Count = g.Count() }); 
関連する問題