2017-08-04 13 views
1

(Linqを使用して)ストアドプロシージャから結果セットをフィルタリングしようとしています。複数の列をグループ化してフィルタリングする

返されたデータは、次のようになります。

+---------+------+-------+-------+-------+-------+ 
| Customer| Item | Week1 | Week2 | Week3 | Week4 | 
+---------+------+-------+-------+-------+-------+ 
| A  | 1 | NULL | NULL | NULL | NULL | 
| A  | 2 | NULL | NULL | NULL | NULL | 
| B  | 1 | NULL | M  | NULL | NULL | 
| B  | 2 | M  | NULL | E  | NULL | 
| C  | 1 | NULL | NULL | NULL | NULL | 
| C  | 2 | M  | NULL | NULL | M  | 
+---------+------+-------+-------+-------+-------+ 

私はすべての項目のすべての週の列にわたってNULL持っている顧客をフィルタリングしようとしています。この場合、顧客Aの行を除外したいが、顧客BとCのすべての行と列をリストしたい。完全な結果セットは数百の顧客と数千のアイテムになる。

私はデータをまとめてグルーピングしていますが、実際には不要なアイテムを削除するのに問題があります。あなたはそれを注文した後

custEvents.GroupBy(
ce => new 
{ 
    custId = ce.companyID, 
    week1 = ce.wk1eventId, 
    week2 = ce.wk2eventId, 
    week3 = ce.wk3eventId, 
    week4 = ce.wk4eventId 
} 
).OrderBy(ce => ce.Key.custId); 

答えて

3
var customers = data.Where(c => c.Week1 != null || c.Week2 != null || c.Week3 != null || c.Week4 != null).Select(c => c.CustomerId); 
var filteredResult = data.Where(c => customers.Contains(c.CustomerId)); 
+0

彼は、任意の、ヌルとしてすべてのそれらの性質を有するものではなくフィルタリングしたいですプロパティ。 – Dido

0

は常に削除でした。

custEvents.RemoveAll(x => x.Customer = "A" && x.week1 = null && x.week2 = null && x.week3 = null && x.week4 = null); 
+0

彼らは必要のない要素を注文するウエストのCPUサイクルになるでしょう。 – Dido

+0

私はあなたが答えた方法でやりますが、私はOPがすでにそれを注文しているので別の選択肢を提供していました –

1

あなたは顧客によってグループ化するとnull以外の週の記録を持っているグループを取得のような音:

custEvents.GroupBy(c => c.Customer) 
      .Where(g => g.Any(c => c.wk1eventId != null || c.wk2eventId != null || c.wk3eventId != null || c.wk4eventId != null)) 
      .SelectMany(g => g);