当我使用 '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
.
根据你想做什么,有几种可能的解决方案:
不要使用 dynamic
。相反,让 Student
和 Teacher
实现一个公共接口(比如 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();
作为普通静态方法调用AsQueryable()
:
dynamic result = GetPeopleData(sex, age);
IQueryable rows = Queryable.AsQueryable(result);
顺便说一句,检查 sex 是否超过 30 对我来说没有任何意义。您可能应该重新考虑设计的那一部分。
一开始,我没有使用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
.
根据你想做什么,有几种可能的解决方案:
不要使用
dynamic
。相反,让Student
和Teacher
实现一个公共接口(比如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();
作为普通静态方法调用
AsQueryable()
:dynamic result = GetPeopleData(sex, age); IQueryable rows = Queryable.AsQueryable(result);
顺便说一句,检查 sex 是否超过 30 对我来说没有任何意义。您可能应该重新考虑设计的那一部分。