简体   繁体   中英

To apply mulitple criteria in lambda expression in c#

I have two main tables Listings and Place . In listing table there is a field PlaceId which referes to a Place entity/row/object . I want to query on both tables so that i get both of them like this .

 var query = context.Listings
       .Include("Place")
       .Where(l => l.Place.TypeId == Type.Ro)
       .OrderBy(l => l.Id).ToList();

after this now i want to put some filter on this query , here is the condition .

i got only a string like this var filter = "1,2,4"; . Now i want to filter on listing to gett all these listing where bedroom is equal to 1 OR 2 OR 4 .

What i have done

 string minBeds = "1,2,4";

 foreach (var item in minBeds.Split(','))
 {
      int minBed = int.Parse(item);
      query = query.Where(l=>l.Place.Bedroom == minBed).ToList();
 }

But doing this is giving me Zero result.

The problem with the way you're filtering it. After the first pass, you're filtering out everything except where Bedroom == 1 , on the second pass you're filtering out everything except where Bedroom == 2 , but since the only items in the list have Bedroom == 1 , you won't have anything in the result set.

The solution is to use the conventional C# || operator:

query = query.Where(l => l.Place.Bedroom == "1" || 
                         l.Place.Bedroom == "2" || 
                         l.Place.Bedroom == "4");

Or if you want to be more flexible, use the Contains method:

string[] minBeds = "1,2,4".Split(',');
query = query.Where(l => minBeds.Contains(l.Place.Bedroom));

Note if Bedroom is an integer, you'll need to convert the input to an appropriate type first:

var minBeds = "1,2,4".Split(',').Select(int.Parse);
query = query.Where(l => minBeds.Contains(l.Place.Bedroom));

Also note, I've eliminated the ToList here. Unless you need to access items by index and add / remove items from the result collection, it's most likely just a waste of resources. You can usually rely on Linq's native laziness to delay processing to query until you really need the result.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM