在c#中的lambda表达式中应用多个条件
本文关键字:应用 条件 表达式 中的 lambda | 更新日期: 2023-09-27 18:20:44
我有两个主表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();
}
但这样做的结果是零。
过滤方式的问题。第一次过滤后,您将过滤掉除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的原生惰性来延迟查询处理,直到您真正需要结果。