EF Core 5.0中DbSet<TEntity>的Where扩展方法所属类如何查找
问题解答
核心结论
DbSetIQueryable<T>接口,对应的Where、Intersect等LINQ查询扩展方法全部定义在System.Linq.Queryable静态类中,你之前的错误是泛型参数传递错误,不是类定位错误。
错误原因说明
- 你第二段代码中调用
MakeGenericMethod时传入了typeof(DbSet<Student>),这是错误的:Queryable.Where方法的泛型参数是实体类型(即Student),不是DbSet的类型。 - 你第一段GetMethod的调用逻辑本身是正确的,无法获取通常是命名空间引用、参数匹配的小问题。
正确获取MethodInfo的写法
获取Where方法的正确代码
// 泛型参数为实体类型Student MethodInfo whereMethod = typeof(Queryable) .GetMethods(BindingFlags.Public | BindingFlags.Static) .First(m => m.Name == nameof(Queryable.Where) && m.GetParameters().Length == 2 // 匹配带两个参数的Where重载 && m.GetParameters()[1].ParameterType.GetGenericTypeDefinition() == typeof(Expression<>)) .MakeGenericMethod(typeof(Student)); // 这里传实体类型,不是DbSet<Student>
获取Intersect方法的正确代码
MethodInfo intersectMethod = typeof(Queryable) .GetMethods(BindingFlags.Public | BindingFlags.Static) .First(m => m.Name == nameof(Queryable.Intersect) && m.GetParameters().Length == 2) .MakeGenericMethod(typeof(Student));
调用验证示例
你拿到MethodInfo后,调用时第一个参数传IQueryable实例即可,比如:
IQueryable<Student> source = dbContext.Student; // 构造你的过滤表达式 Expression<Func<Student, bool>> predicate = s => s.Address.ZipCode == 10005; // 调用Where方法 var filteredQuery = whereMethod.Invoke(null, new object[] { source, predicate }) as IQueryable<Student>;
内容的提问来源于stack exchange,提问作者Francois Denis
相关产品推荐
相关产品推荐

