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

时间:2013-07-02 05:42:07

标签: c# c#-4.0 lambda c#-3.0

我有两个主要表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();
 }

但这样做会给我零结果。

1 个答案:

答案 0 :(得分:6)

您过滤它的方式存在问题。在第一次通过后,您将过滤除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的原生懒惰来延迟处理查询,直到您确实需要结果。