来自 docs 的
IQueryProvider.CreateQuery
方法:
创建查询(表达式):
构造一个 IQueryable 对象,该对象可以评估查询 由指定的表达式树表示。
EnumerableQuery
如何验证它可以评估查询:
IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression) {
ArgumentNullException.ThrowIfNull(expression);
if (!typeof(IQueryable<TElement>).IsAssignableFrom(expression.Type)) {
throw Error.ArgumentNotValid(nameof(expression));
}
return new EnumerableQuery<TElement>(expression);
}
还有 ef-core 的
EntityQueryProvider
实现:
public virtual IQueryable<TElement> CreateQuery<TElement>(Expression expression)
=> new EntityQueryable<TElement>(this, expression);
...
public EntityQueryable(IAsyncQueryProvider queryProvider, Expression expression) {
_queryProvider = queryProvider;
Expression = expression;
}
在第一种情况下,我们得到了
Expression.Type
是IQueryable<T>
的最小验证,而在第二种情况下没有验证。所以看起来 CreateQuery
在实践中可能只是一个工厂方法,只有很少的验证或没有验证。
我知道访问这棵树并检查我们稍后是否可以使用它来成功调用
Execute()
有点不切实际且缓慢。
如果这不是“可以评估”的意思,那么它是否意味着任何特定的东西或者应该完全忽略它?
在此上下文中,术语“可以评估”并不意味着验证或检查某些事情是否可能。相反,它描述了使用返回的
IQueryable
实例将获得作为给定表达式编写的查询结果。