使用另一个列表的属性过滤对象列表。使用linq

时间:2010-04-19 21:09:21

标签: c# linq c#-3.0

我的情况很好,我认为在开始时这是一个常见的查询,但我在尝试解决这个问题时遇到了一些问题,情况是:

我有一个“房屋”列表,每个房子都有一个“Windows”列表。而且我想过滤一个目录只有那个女巫有一个蓝色的窗户,所以我的扩展方法就是这样:

public static List<House> FilterByWindow (this IEnumerable<House> houses, Window blueOne){

    var list = houses.Select(p=>p.Windows.Where(q=>q.Color == blueOne.Color));
    return list.ToList();
}

这是正确的还是我失去了什么?一些更好的建议?

2 个答案:

答案 0 :(得分:2)

如果您要搜索包含蓝色House的{​​{1}}个实例,请使用现有的Windows扩展程序:

Any

您现在拥有的是正确。 var blueWindowHouses = from h in houses where h.Windows.Any(w => w.Color == blueOne.Color) select h; 扩展程序不会过滤 - 它是一个投影,并且您没有将结果分配给任何内容,因此您拥有的行实际上是无操作。

此外,通过将此逻辑包装在方法中,可以防止表达式编译器将其转换为SQL语句。相反,如上所述,一次性写下所有内容,或者接受并返回Select,而不是接受IQueryable<House>并返回IEnumerable<House>

答案 1 :(得分:2)

return houses.Where(house => house.Windows.Any(window => window.Color == blue))
             .ToList();