2016-03-24 7 views
0

を設定します。LINQは、私は次のように非常によく似たクエリを持って

var query = plans 
.Where(p => 
     p.IsOptOut || 
     (p.PropertyType == PropertyType.Property1 && p.SomeCollection.Count > 0)) 
.Select(p => 
     new CustomClass 
     { 
      Id = p.Id, 
      PropertyType = p.PropertyType, 
      IsOptOut = p.IsOptOut 
     }); 

だから我々はplansからIsOptOutが真であるOR p.PropertyTypeが特定されるすべてのレコードを選択します値AND p.SomeCollectionには少なくとも1つのレコードがあります。

これは次のように設定することができ、結果に自分自身を貸すだろう:私はLINQクエリを変更するにはどうすればよい

Id   PropertyType   IsOptOut 
1   Foo     true 
2   Foo     false 
3   Foo     false 
4   Bar     true 
5   Baz     true 
6   Baz     false 

ように節がplansコレクション内の他のレコードに現在のレコードを比較することができWHEREとIsOptOutがtrueのレコードを除外し、指定されたプロパティタイプに対して返された唯一のレコードです。

上記の例では、IsOptOutがtrueで、 "Bar"のPropertyTypeの結果セットに他のレコードがないため、ID#4を結果セットから除外する必要があります。

副題として、IsOptOutが真の場合、SomeCollectionにレコードが存在しないというビジネスルールです。

答えて

1

あなたは同じWhere句で直接それを行うことはできませんが、このようなものを使用することができます(コメントを参照してください):

var query = plans 
.Where(p => 
     p.IsOptOut || 
     (p.PropertyType == PropertyType.Property1 && p.SomeCollection.Count > 0)) 
.GroupBy(p => p.PropertyType) // group the result by property type so we can count the items 
.Where(g => !(g.Count() == 1 && g.FirstOrDefauilt().IsOptOut)) // apply the requested criteria 
.SelectMany(g => g) // flatten back the result 
.Select(p => 
     new CustomClass 
     { 
      Id = p.Id, 
      PropertyType = p.PropertyType, 
      IsOptOut = p.IsOptOut 
     }); 
+0

働いた、ありがとう! – Scott