我正在为现有工具编写IQueryable
实现。此工具的一个非常常见的功能是类似于数据库中存在的查询。为了支持这一点,我想用以下方法扩展IQueryable
:
public static IQueryable<T> WhereExists<T, U>(
this IQueryable<T> Current,
IQueryable<U> Other,
Func<T, Field> CurrentSelector) where U : Entity
{
return WhereExists(Current, Other, x => x.ID, CurrentSelector);
}
public static IQueryable<T> WhereExists<T, U>(
this IQueryable<T> Current,
IQueryable<U> Other,
Func<U, Field> RemoteSelector,
Func<T, Field> CurrentSelector) where U : Entity
{
throw new NotImplementedException(
"This method is only implemented for db-backed queries.");
}
扩展方法的存在允许我通过编译器,真正的功能将在表达式访问者中。
问题在于,我希望在Expression中显示这一点,但它正在运行到扩展方法。是否有必要遵循的限制才能将其纳入表达式(例如.Where等)?
答案 0 :(得分:1)
让我们看看.NET框架是如何做到的:
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
return source.Provider.CreateQuery<TSource>(
Expression.Call(null, ((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource) }), new Expression[] { source.Expression, Expression.Quote(predicate) }));
}
他们将参数打包成一个调用表达式。
我建议您尽可能坚持使用默认的Queryable
方法,这样就不需要做太多的工作了。