从Queryable获取Where方法



以下查询从Queryable:返回两个Where方法

var foundedMethods = typeof(Queryable).GetMethods()
.Where(m => m.Name == nameof(Queryable.Where) && 
m.GetParameters().Length == 2)
.Where(p => p.GetParameters().First().ParameterType.GetGenericTypeDefinition() == typeof(IQueryable<>)
&& p.GetParameters().Last().ParameterType.GetGenericTypeDefinition() == typeof(Expression<>)).ToList();

我得到了两个针对QueryableWhere方法调用。但是,我只需要以下内容:

Where<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>)

我需要在上面的查询中添加哪些添加过滤器?有什么指南和帮助我如何通过特定参数筛选方法吗?

按照问题的风格,检查func是否也有正确数量的泛型参数就足够了,因为返回的另一个重载有一个额外的(Func<TSource,Int32,Boolean>(

在Func上执行与表达式参数相同的类型检查是一个好主意,但目前没有必要这样做。

var foundedMethods = typeof(Queryable).GetMethods()
.Where(m => m.Name == nameof(Queryable.Where)
&& m.GetParameters().Length == 2)
.Where(p => p.GetParameters().First().ParameterType.GetGenericTypeDefinition() == typeof(IQueryable<>)
&& p.GetParameters().Last().ParameterType.GetGenericTypeDefinition() == typeof(Expression<>)
// Ensure Func has 2 args
&& p.GetParameters().Last().ParameterType.GetGenericArguments().First().GetGenericArguments().Length == 2)
.ToList();

或者,一种简单的方法是通过在MethodInfo.ToString()上匹配来直接找到方法签名

var foundedMethods = typeof(Queryable).GetMethods()
.Where(m => m.ToString() ==
"System.Linq.IQueryable`1[TSource] Where[TSource](System.Linq.IQueryable`1[TSource], System.Linq.Expressions.Expression`1[System.Func`2[TSource,System.Boolean]])")
.ToList();

最新更新