当我使用 'dynamic' 来使用 AsQueryable 方法时,我的代码有什么区别?

What is the difference between my codes when I use 'dynamic' to use AsQueryable method?

一开始,我没有使用dynamic,我只是使用这样的代码,而且效果很好。

  List<Student> result2 = StudentRepository.GetStudent(sex,age).ToList();
  IQueryable rows2 = result2.AsQueryable();

但是当我改成dynamic的时候,就报错了

 dynamic result = GetPeopleData(sex,age);
 IQueryable rows = result.AsQueryable();

然后我添加了这样的方法,我构建的项目显示 List 没有 AsQueryable method.How 来更改它?

 private dynamic GetPeopleData(int sex, int age)
    {
        if(sex>30)
            return StudentRepository.GetStudent(sex,age).ToList();
        else
            return TeacherRepository.GetTeacher(sex, age).ToList();
    }

It is similar to this question.

正如@jbtule 所说,匿名类型是内部的,如果您跨越程序集边界动态无法解析 属性。

与其使用匿名类型,不如尝试使用实际类型或 Expando 对象。

AsQueryable() is an extension method and those don't work on dynamic.

根据你想做什么,有几种可能的解决方案:

  1. 不要使用 dynamic。相反,让 StudentTeacher 实现一个公共接口(比如 IPerson)并使用它:

    private IReadOnlyList<IPerson> GetPeopleData(int sex, int age)
    {
        if (sex > 30)
            return StudentRepository.GetStudent(sex, age).ToList();
        else
            return TeacherRepository.GetTeacher(sex, age).ToList();
    }
    
    …
    
    var result = GetPeopleData(sex, age);
    IQueryable<IPerson> rows = result2.AsQueryable();
    
  2. 作为普通静态方法调用AsQueryable()

    dynamic result = GetPeopleData(sex, age);
    IQueryable rows = Queryable.AsQueryable(result);
    

顺便说一句,检查 sex 是否超过 30 对我来说没有任何意义。您可能应该重新考虑设计的那一部分。