Linq Lambda Where子句在where子句

时间:2015-12-07 11:03:46

标签: c# linq lambda

我正在尝试使用serval构建一个lambda表达式,其中where子句相互之间。

项目,webProperties和配置文件都是列表。我试图找到一个包含3级列表的配置文件。实际上,我真正想做的就是验证它确实存在。

 var x = AccountSummeriesResponse.items.Where(wp => wp.webProperties.Where(p => p.profiles.Where(a => a.id == profile ))).FirstOrDefault();

我收到以下错误。

  

无法隐式转换类型   ' System.Collections.Generic.IEnumerable'   到了布尔'

2 个答案:

答案 0 :(得分:9)

问题是Enumerable.Where返回IEnumarable<T>,但Where的谓词需要一个boolen。您可以改为使用Any: -

var x = AccountSummeriesResponse.items
           .Where(wp => wp.webProperties.Any(p => p.profiles.Any(a => a.id == profile )))
           .FirstOrDefault();

此外,您可以像这样替换Where with FirstOrDefault: -

 var x = AccountSummeriesResponse.items
         .FirstOrDefault(wp => wp.webProperties.Any(p => p.profiles
                                               .Any(a => a.id == profile )));

答案 1 :(得分:0)

那是因为where子句中的委托(Predicate)需要返回bool而你返回IEnumerable(Where(p => p.profiles.Where(a => a.id == profile )))所以报告编译错误。

如果您正在寻找是否存在于集合类中,请使用Any扩展方法。

var x = AccountSummeriesResponse.items.Where(wp => wp.webProperties.Any(p => p.profiles.Any(a => a.id == profile ))).FirstOrDefault();