gpt4 book ai didi

c# - 为什么 IQueryable 上的 .Where() 根据是否将 Lamba 或 Func 作为参数传递返回不同的类型

转载 作者:行者123 更新时间:2023-11-30 13:32:49 26 4
gpt4 key购买 nike

在我的 Entity Framework Code First 项目中,我有一个包含路由的存储库对象

public class EFRepository
{
...
public IQueryable<Route> Routes
{
get { return context.Routes; }
}
...
}

如果我跑

var routes = this.repository.Routes
.Where(r => r.DeployedService.IsActive.HasValue
&& r.DeployedService.IsActive.Value);

路由对象的类型是IQueryable<Route> .

但是,如果我运行

Func<Route, bool> routeIsActive = r => r.DeployedService.IsActive.HasValue 
&& r.DeployedService.IsActive.Value;
var routes = this.repository.Routes.Where(routeIsActive);

本例中的路由对象是 IEnumerable<Route> 类型.

我原以为他们会得到相同的评估,但显然我错了。这两个语句有什么区别,为什么它们返回不同的类型。

最佳答案

方法.Where(Expression<Func<Route,bool>>)IQueryable<Route> 定义.方法.Where(Func<Route,bool>)另一方面由 IEnumerable<Route> 定义而不是 IQueryable<Route> .因此,每个都返回自己的类型以实现流畅的 LINQ 方法链接。

IQueryable定义的附加方法允许将表达式树向下推送到 LINQ 提供程序,例如LINQ-to-entities,用于在可能的情况下在提供程序级别进行延迟延迟评估。

关于c# - 为什么 IQueryable 上的 .Where() 根据是否将 Lamba 或 Func<T,Tresult> 作为参数传递返回不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539012/

26 4 0