在c#中的lambda表达式中应用多个条件

本文关键字:应用 条件 表达式 中的 lambda | 更新日期: 2023-09-27 18:20:44

我有两个主表ListingsPlace。在列表表中有一个字段PlaceId,它引用Place实体/行/对象。我想查询这两个表,这样我就可以像这样得到它们。

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

在这之后,现在我想对这个查询进行一些筛选,这是条件。

我只有一个像这样的字符串var filter = "1,2,4";。现在我想过滤列表,得到所有这些列表,其中卧室等于1或2或4。

我做了什么

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

但这样做的结果是零。

在c#中的lambda表达式中应用多个条件

过滤方式的问题。第一次过滤后,您将过滤掉除Bedroom == 1以外的所有内容,第二次过滤时,您将筛选出除Bedroom == 2以外的所有信息,但由于列表中只有Bedroom == 1项,因此结果集中不会有任何内容。

解决方案是使用传统的C#||运算符:

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

或者,如果你想更灵活,可以使用Contains方法:

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

注意,如果Bedroom是一个整数,则需要首先将输入转换为适当的类型:

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

另外请注意,我在这里已经消除了ToList。除非需要通过索引访问项并从结果集合中添加/删除项,否则这很可能只是浪费资源。您通常可以依靠Linq的原生惰性来延迟查询处理,直到您真正需要结果。