我有两个主要表Listings
和Place
。在列表中有一个字段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();
}
但这样做会给我零结果。
答案 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的原生懒惰来延迟处理查询,直到您确实需要结果。