大家好我需要帮助来理解这件事.为什么在下面的代码中变量“ejes”和“habilidades”被解析为“动态”而第三个被解析为IEnumerable.这会影响下一个运行的代码,当我尝试调用扩展方法“Count()”时会出现异常,因为“ejes”和“habilidades”不是IEnumerable …..我根本就没有得到它.它们是“
Database.Query”相同方法的结果.
这是片段:
var db = Database.Open("froned");
db.Execute("begin transaction");
try
{
var asignacion = db.QuerySingle("select * from asignacion_avanza where id_asignacion = @0", id_asignacion);
var ejes = db.Query(String.Format(@"
select id_eje
from asignatura_eje_nivel
where id_nivel = {0}
and id_asignatura = {1}",
asignacion.id_nivel,
asignacion.id_asignatura));
var habilidades = db.Query(String.Format(@"
select id_habilidad
from asignatura_habilidad_nivel
where id_nivel = {0}
and id_asignatura = {1}",
asignacion.id_nivel,
asignacion.id_asignatura));
var dificultades = db.Query("select id_dificultad from dificultad");
var c_dif = dificultades.Count();
var c_eje = ejes.Count();
var c_habilidades = habilidades.Count();
我放了一个调试器的图像来显示变量的运行时类型.
最佳答案 asignacion.id_nivel和asignacion.id_asignatura是动态类型.
当您将动态类型作为参数传递给任何方法时,该方法的返回类型将变为动态,而不是MSDN所说的任何方式.您不能在动态类型上使用扩展方法. Count()是Enumerable的扩展方法.这就是你得到例外的原因.
有两种方法可以解决问题并将返回类型还原为Enumerable.第一个是明确定义它:
IEnumerable<dynamic> data = db.Query(someSQL, parameterValue);
另一种是将参数转换为非动态类型:
var data = db.Query(someSQL, (string)parameterValue);
正如Knox指出的那样,你必须使用参数而不是string.Format.