簡體   English   中英

LINQ有條件和

[英]LINQ conditional and

我有一組帶有過濾器的數組,這些過濾器需要作為“和”操作進行匹配。 我是一個過濾器數組為空,應解釋為包括此過濾器的所有內容:

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();

拉胡爾引導着正確的方向。 數組不能為空。 解決為:

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

一個簡單的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對象(IEnumerable)也是如此。
我正在使用ClustersSelected?.Any() == true來捕獲null屬性和空集合的兩種情況。

好吧,考慮到ClustersSelected是數組類型,您可以使用如下所示的復合條件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM