2017-09-13 8 views
-1

"and"演算と一致する必要があるフィルタを持つ配列のセットがあります。LINQ条件式と

List<string> cars = new List<string>(); 
List<string> flights = new List<string>(); 
      flights.Add("Boing"); 
      flights.Add("Airbus"); 

      var transports = new List<Transport>(); 
      var t1 = new Transport("Ford", "Boing"); 
      var t2 = new Transport("BMW", "Boing"); 
      var t3 = new Transport("BMW", "Flights INC"); 

      transports.Add(t1); 
      transports.Add(t2); 
      transports.Add(t3); 

      //returns 0 result. In this scenario I would expect to get all with boing and Airbus and cars excluded from search because its empty 
      var result = transports.Where(p => 
       (cars.Count>0 && cars.Contains(p.CarType)) && 
       (flights.Count > 0 && flights.Contains(p.FlightType))).ToList(); 


     cars = new List<string>(); 
      flights = new List<string>(); 
      cars.Add("BMW"); 
      flights.Add("Boing"); 

      IEnumerable<Transport> result2 = transports; 

      if (cars?.Any() == true) 
      { 
       result2 = transports.Where(p => cars.Contains(p.CarType)); 
      } 
      if (flights?.Any() == true) 
      { 
       result2 = transports.Where(p => flights.Contains(p.FlightType)); 
      } 

      // all rows returned here I only want t2 
      var r = result2.ToList(); 

ラーフルは正しい方向に導かれたこと:私は、フィルタアレイは、このフィルタのためにすべてを含めるよう、それがinterpreetedしなければならない空です。配列をnullにすることはできません。それを解決:

     statusViewResult = statusViewResult.Where(p=> 
      (query.ClustersSelected.Count == 0 || query.ClustersSelected.Contains(p.Cluster)) && 
      (query.ParkNamesSelected.Count == 0 || query.ParkNamesSelected.Contains(p.ParkName))); 
+0

です。{プロパティ名}は、いくつかの価値がありますか? right – Ajay2707

+0

配列に値が含まれていない場合、Containsはfalseになります。あなたが望むものではありませんか? –

+0

このようなことがありますが、statusViewResult = statusViewResult.Where(p => (query.ClustersSelected!= null && query.ClustersSelected.Contains(p.Cluster))&& (query.ParkNamesSelected!= null && query.ParkNamesSelected。 Contains(p.ParkName))); –

答えて

1

さてあなたはClustersSelectedを考慮の下のような複合条件を使用することができますが、この条件は、あなたがpを持っていることを意味し、配列型

.Where(p => query.ClustersSelected.Length > 0 && query.ClustersSelected.Contains(p.Cluster) 
+0

これを試しましたが、このコンテキストではエンティティタイプ、列挙型またはプリミティブ型のみがサポートされています –

+0

statusViewResult = statusViewResult.Where(p => (query.ClustersSelected!= null && query.ClustersSelected.Contains(p.Cluster) )&& (query.ParkNamesSelected!= null && query.ParkNamesSelected.Contains(p.ParkName))); –

+0

@ThomasSegato、null(インスタンス化されていない配列)と要素のない配列が異なる – Rahul

2

シンプルifはそれを行うだろう:

if(query.ClustersSelected?.Any() == true) 
{ 
    statusViewResult = statusViewResult.Where(p => query.ClustersSelected.Contains(p.Cluster)); 
} 
if(query.ParkNamesSelected?.Any() == true) 
{ 
    statusViewResult = statusViewResult.Where(p => query.ParkNamesSelected.Contains(p.ParkName)); 
} 

各検討事項は、コレクションに別のフィルタを追加します。小さなSQLクエリを生成するためにEntity Framework(およびIQueryable)でこのようなコードを使用することがよくありますが、オブジェクトへのLINQ(IEnumerable)と同様に機能します。
nullプロパティと空のコレクションの両方のケースをキャッチするのにClustersSelected?.Any() == trueを使用しています。

+0

しかし、両方の配列に値がある場合、2番目のステートメントは最初のステートメントのサブセットにすぎないという問題がありますか?以下のコードはdosentの仕事ですが、これは私がやろうとしていることです:statusViewResult = statusViewResult.Where(p => (query.ClustersSelected!= null && query.ClustersSelected.Contains(p.Cluster))&& (query。 ParkNamesSelected!= null && query.ParkNamesSelected.Contains(p.ParkName))); –

+0

@ThomasSegato - 両方の配列に値がある場合は、両方の条件を満たす必要があります。あなたのコードは同じように動作すると思います。 – Kobi

+0

Arrayの 'Length'プロパティを' Any() 'を使用する代わりに使用するのはなぜですか? – Rahul