从 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解析(从XML数据创建匿名或真实对象)