0

我想利用 LinqKit 的 AsExpandable 功能来翻译我的 linq 查询中的自定义方法。

我可以通过实现我自己的表达式访问者来实现这一点,它将我的自定义方法转换为 EF 提供者可以理解的表达式。

在深入研究了 LinqKit 源代码之后,在我看来,LinqKit 并不是为支持这种情况而设计的,即使它在其主页上这么说(参见捕获)。

如何将自定义访问者插入 LinqKit 的管道?有什么想法或建议吗?

非常感谢 !

里亚纳

LinqKit 主页

4

1 回答 1

2

我认为他们只是指的是这种过载AsExpandable

public static IQueryable<T> AsExpandable<T>(this IQueryable<T> query, Func<Expression, Expression> queryOptimizer)

尽管参数名为“queryOptimizer”,但您实际上可以传入任何参数Func<Expression, Expression>,并且在将表达式传递到查询提供程序之前立即调用该参数:

    IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)
    {
        var expanded = expression.Expand();
        var optimized = _queryOptimizer(expanded);
        return _query.InnerQuery.Provider.CreateQuery<TElement>(optimized).AsExpandable();
    }

默认情况下,_queryOptimizer最终只是一个 ID 函数。之所以这样命名,是因为 LinqKit 也隶属于这​​个项目:https ://github.com/Thorium/Linq.Expression.Optimizer 。

于 2018-06-25T14:35:47.080 回答