如何扩展 LinqKit 并在 linq 查询中使用自定义方法?
How to extend LinqKit and use a custom method within a linq query?
我想利用 LinqKit 的 AsExpandable 功能来转换我的 linq 查询中的自定义方法。
我可以通过实现我自己的表达式访问者来实现这一点,它将我的自定义方法转换为 EF 提供程序可以理解的表达式。
在深入研究了 LinqKit 源代码之后,在我看来,LinqKit 并不是为了支持这种情况而设计的,即使它在其主页上是这样说的(见截图)。
如何将自定义访问者插入到 LinqKit 的管道中?有什么想法或建议吗?
非常感谢!
莉安娜
来自
我认为他们只是指 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.
我想利用 LinqKit 的 AsExpandable 功能来转换我的 linq 查询中的自定义方法。
我可以通过实现我自己的表达式访问者来实现这一点,它将我的自定义方法转换为 EF 提供程序可以理解的表达式。
在深入研究了 LinqKit 源代码之后,在我看来,LinqKit 并不是为了支持这种情况而设计的,即使它在其主页上是这样说的(见截图)。
如何将自定义访问者插入到 LinqKit 的管道中?有什么想法或建议吗?
非常感谢!
莉安娜
来自
我认为他们只是指 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.