gpt4 book ai didi

c# - Database.Query 返回类型应该是 IEnumerable

转载 作者:行者123 更新时间:2023-11-30 12:30:38 27 4
gpt4 key购买 nike

我需要帮助来理解这件事。为什么在下面的代码中变量“ejes”和“habilidades”被解析为“dynamic”而第三个被解析为IEnumerable<dynamic> .这会影响接下来运行的代码,当我尝试调用扩展方法“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();

我放了一个调试器的图像来显示变量的运行时类型。

Extrange return type

最佳答案

asignacion.id_nivelasignacion.id_asignatura 是动态类型。

当您将动态类型作为参数传递给任何方法时,该方法的返回类型将变为动态类型,而不是 MSDN 所说的任何类型。您不能对动态类型使用扩展方法。 Count()Enumerable 的扩展方法。这就是你得到异常(exception)的原因。

有两种方法可以解决问题,将返回类型恢复为 Enumerable。第一种是显式定义:

IEnumerable<dynamic> data = db.Query(someSQL, parameterValue);

另一种是将参数转换为非动态类型:

var data = db.Query(someSQL, (string)parameterValue);

正如 Knox 指出的那样,您必须使用参数而不是 string.Format。

关于c# - Database.Query 返回类型应该是 IEnumerable<dynamic>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15710519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com