2010-04-19 98 views
1

我有一个很好的情况,我认为在开始这个通常的查询,但我有一些问题,试图解决这个问题,情况是:使用属于另一个列表的属性过滤对象的列表。使用linq

我有一个“房屋”的列表,每个房子都有一个“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

如果你想搜索包含蓝色WindowsHouse实例,然后利用现有的Any扩展:

var blueWindowHouses = 
    from h in houses 
    where h.Windows.Any(w => w.Color == blueOne.Color) 
    select h; 

你现在所拥有的是什么正确。 Select扩展不会过滤 - 它是一个投影,并且不会将结果分配给任何内容,因此您拥有的行实际上是无操作的。

此外,通过将此逻辑封装在方法中,可以防止表达式编译器能够将其转换为SQL语句。相反,按照上面的说明将它全部写入,或者接受并返回IQueryable<House>而不是接受IEnumerable<House>并返回List<House>

+0

这个解决方案工作的很好,但现在我意识到我有另一个业务需求。我的最终名单必须只有蓝色的窗户,有一些简单的linq解决方案吗? – Custodio 2010-04-20 13:33:18

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

这将返回一个'List ' – Lee 2010-04-19 21:17:17

+0

'Select'和'Where'在我的键盘上彼此相邻。我总是把它们混在一起。 – dtb 2010-04-19 21:18:51

+1

你有'Select'和'Where'的专用键吗?我在哪里可以得到这些键盘之一? – Aaronaught 2010-04-19 21:32:35

相关问题