You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core 5.0中DbSet<TEntity>的Where扩展方法所属类如何查找

问题解答

核心结论

DbSet实现了IQueryable<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 10:00:01