IQueryProvider.CreateQuery 需要执行什么验证才能确保它可以计算表达式参数?

问题描述 投票:0回答:1

来自 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()
有点不切实际且缓慢。

如果这不是“可以评估”的意思,那么它是否意味着任何特定的东西或者应该完全忽略它?

c# expression iqueryable
1个回答
0
投票

在此上下文中,术语“可以评估”并不意味着验证或检查某些事情是否可能。相反,它描述了使用返回的

IQueryable
实例将获得作为给定表达式编写的查询结果。

© www.soinside.com 2019 - 2024. All rights reserved.