使用
IQueryable<T> query - where T : BaseEntity
我有以下代码,在泛型方法中使用 - 使用反射来调用.Where()方法(这是有效的):
var predicate = Expression.Lambda(body, item);
MethodInfo whereCall = (typeof(Queryable).GetMethods().First(mi => mi.Name == "Where" && mi.GetParameters().Length == 2).MakeGenericMethod(query.ElementType));
MethodCallExpression call = Expression.Call(whereCall, new Expression[] { query.Expression, predicate });
query = query.Provider.CreateQuery<T>(call);
我想使用这样的东西(并避免反思):
var predicate = Expression.Lambda<Func<T, bool>>(body, item);
query = query.Where(predicate);
但是这段代码的问题是T被用作基类型,而不是运行时的派生类型 。
如何将T转换为query.ElementType(派生类型)?
答案 0 :(得分:2)
你的第二段代码确实比第一段更好。您需要使用反射以某种方式调用Expression.Lambda
方法。一个方便的方法是:
static IQueryable<T> CreateQuery<T>(IQueryable<T> query, ...) {
var predicate = Expression.Lambda<Func<T, bool>>(body, item);
query = query.Where(predicate);
return query;
}
使用T作为派生类型调用此方法。您可以使用MakeGenericMethod
执行该通话。根据您的情况,可能会说:
CreateQuery((dynamic)query);