成为表达式的IQueryable扩展方法

时间:2014-06-09 11:53:45

标签: c# expression iqueryable

我正在为现有工具编写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等)?

1 个答案:

答案 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方法,这样就不需要做太多的工作了。