2017-09-13 52 views
-1

我有与需要作为一个“和”操作的匹配滤波器的一组阵列。余的过滤器数组为空应当interpreeted作为包括用于该过滤器的所有内容: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(); 

的Rahul引导是在正确的方向。数组不能为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

Somethink like this but but working working statusViewResult = statusViewResult.Where(p => (query.ClustersSelected!= null && query.ClustersSelected.Contains(p.Cluster))&& (query.ParkNamesSelected!= null && query.ParkNamesSelected。含有(p.ParkName))); –

回答

1

那么你可以使用复合条件像下面考虑ClustersSelected是数组类型

.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,具有阵列空(未例示)和阵列没有元素是不同的 – 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)); 
} 

每个考虑又增加了过滤器收集。我经常在Entity Framework(和IQueryable)中使用这样的代码来生成更小的SQL查询,但它对于LINQ to object(IEnumerable)也同样适用。
我使用ClustersSelected?.Any() == true搭上null属性这两种情况下,和一个空的集合。

+0

但是这里的问题是,如果两个数组都有值,那么第二个语句只会是第一个语句的子集?下面dosent工作的代码,但它是什么,我试图做的:statusViewResult = statusViewResult.Where(P => (query.ClustersSelected = NULL && query.ClustersSelected.Contains(p.Cluster))&& (查询! ParkNamesSelected!= null && query.ParkNamesSelected.Contains(p.ParkName))); –

+0

@ThomasSegato - 如果两个数组都有值,则应满足两个条件。我认为你的代码行为相同。 – Kobi

+0

为什么不用数组的'Length'属性来代替使用'Any()'? – Rahul