1

我有两个主表ListingsPlace. 在列表中,有一个PlaceId引用 Place entity/row/object 的字段。我想查询这两个表,这样我就可以像这样得到它们。

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

在此之后,现在我想在此查询上放置一些过滤器,这是条件。

我只有一个这样的字符串var filter = "1,2,4";。现在我想过滤列表以获得所有这些卧室等于 1 OR 2 OR 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();
 }

但是这样做会给我零结果。

4

1 回答 1

6

您过滤它的方式的问题。在第一遍之后,您将过滤除 where 之外的所有内容Bedroom == 1,在第二遍中您将过滤除 where 之外的所有内容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 的本机惰性来延迟处理查询,直到您真正需要结果为止。

于 2013-07-02T05:45:51.210 回答