从 linq 查询中解析 bool

Posted

技术标签:

【中文标题】从 linq 查询中解析 bool【英文标题】:Resolving bool from linq query 【发布时间】:2012-05-11 00:55:06 【问题描述】:

我有一个属性OnHomePage,它是一个布尔值。

我正在尝试根据是否从 linq 查询返回结果来设置此值。显然,我可以编写一个外部方法来确定我的查询结果是 null 还是它是否包含一个值,但我希望有更好的方法可以在一行中完成。

这是我当前的代码行:

OnHomePage = im.PageImages.Select(p => p.ImageId == im.Id 
                                      && p.Page.PageName == "/Home")

【问题讨论】:

每个人都在不假思索的情况下回答,如果至少 1 为真,或者全部为真,你的 bool 是否应该返回真......? @RoyiNamir:我认为这不公平。就我个人而言,我确实关注“是否从 linq 查询返回结果。” 那是 Any @jon 我的错。没看到(除非快速编辑...) 【参考方案1】:

您可以使用Any Extension Method 来确定查询是否给出任何结果:

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
                                   && p.Page.PageName == "/Home");

【讨论】:

"Any" 对此特别有用,因为它是短路的,并且会在找到匹配项时停止迭代。 @bryanbcook:.Where(..).Any() 也是如此。 .Any(..) 可能会导致更高效的 SQL 转换,具体取决于 LINQ 提供程序。 @bryanbcook 这可能是 IQueryable,而不是 Enumerable,因此这完全取决于查询提供程序。【参考方案2】:

您应该简单地用.Any 结束查询:

OnHomePage = im.PageImages.Where(p => p.ImageId == im.Id 
                                  && p.Page.PageName == "/Home")
                          .Any();

或者,直接使用Any的另一个重载:

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
                                  && p.Page.PageName == "/Home");

【讨论】:

需要在第一个查询中将Select 更改为Where。第二个查询没问题。【参考方案3】:
OnHomePage = im.PageImages.Where(p => p.ImageId == 
  im.Id && p.Page.PageName == "/Home").Any();

【讨论】:

【参考方案4】:

正如其他用户所说,您可以使用Any()

OnHomePage = im.PageImages.Any(p => p.ImageId == im.Id 
                                      && p.Page.PageName == "/Home");

或者可以使用其他解决方案Exists():

OnHomePage = im.PageImages.ToList().Exists(p => p.ImageId == im.Id 
                                          && p.Page.PageName == "/Home");

Here 是一个有趣的答案,解释了差异。

PS:

在行为上,它们是相同的。

【讨论】:

以上是关于从 linq 查询中解析 bool的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json 中获取 int 并将其解析为 dart 中的 bool?

.NET深入解析LINQ框架(五:IQueryableIQueryProvider接口详解)

无法使用 LINQ 解析 XML 文件中的属性

使用LINQ的简单XML解析(从XML数据创建匿名或真实对象)

.NET深入解析LINQ框架(四:IQueryableIQueryProvider接口详解)

Linq Where Expression<Func<T,bool;;查询条件