gpt4 book ai didi

c# - 为什么 Queryable.SelectMany(...) 重载接受 Func> 而不是 Func>?

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:36 26 4
gpt4 key购买 nike

考虑以下函数:

IQueryable<Bar> foo(IEnumerable<IQueryable<Bar>> sources)
{
return
from source in sources.AsQueryable()
from bar in source
where bar.Xzy == 123
select bar;
}

凭直觉,我希望这会在每个源的上下文中执行“from...where...select”表达式。但是,我相信它只会针对源执行“from bar in ...”部分,而不是执行“where...select”部分作为 LINQ-to-Objects 查询。最终结果是将从每个源检索 SomeTable 的所有行,而不仅仅是那些匹配“where”条件的行。

乍一看,我猜这是因为调用 SelectMany 导致“源”表达式隐式转换为 IEnumerable 。我不确定实现会是什么样子,但是接受 Func > 代替它是否有意义,以便将 where...select 表达式传递给 IQueryable 提供程序?

最佳答案

我认为这取决于编译器如何解释您的查询。它实际上将您的查询变成了这样的东西(严格的从左到右的解析):

sources.AsQueryable()
.SelectMany(source => source)
.Where(bar => bar.Xzy == 123)
.Select(bar => bar)

至关重要的是,您的过滤器会根据首先枚举每个来源的结果进行操作。

另请注意,AsQueryable() 实际上是多余的,因为它并没有使您的源比现在更具可查询性,而是使您的枚举来源可查询,并且您不是在查询该集合,而是在查询各个来源。

我认为你真正想要的更像这样:

sources.SelectMany(source => source.Where(bar => bar.Xzy == 123))

这改变了对子句相对“优先顺序”的解释。

我实际上不确定您将如何使用 LINQ 语法制作后者。

更新:实际上,这是一种方式:

from source in sources
let qsource = (from bar in source
where bar.Xzy == 123
select bar)
from result in qsource
select result

出于这个原因,我通常更倾向于使用扩展方法来制作重要的查询。

关于c# - 为什么 Queryable.SelectMany(...) 重载接受 Func<S, IEnumerable<R>> 而不是 Func<S, IQueryable<R>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com