如何扩展LinqKit并在linq查询中使用自定义方法?

时间:2018-06-21 11:40:26

标签: entity-framework linq expression visitor linqkit

我想利用LinqKit的AsExpandable功能在linq查询中转换我的自定义方法。

我可以通过实现自己的表达式访问器来实现此目的,该访问器会将我的自定义方法转换为EF提供程序可以理解的表达式。

在深入研究了LinqKit源代码之后,在我看来,即使LinqKit在其首页上进行了说明,也并非旨在支持这种情况(请参见捕获)。

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

非常感谢!

Riana

来自LinqKit home page

1 个答案:

答案 0 :(得分:1)

我认为他们只是指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