4

このことを理解するには助けが必要です。次のコードで、変数 "ejes" と "habilidades" が "dynamic" として解決され、3 番目の変数がIEnumerable<dynamic>. これは次に実行するコードに影響を与えています。「ejes」と「habilidades」は IEnumerable ではないため、拡張メソッド「Count()」を呼び出そうとすると例外が発生します。これらは、同じメソッド「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();

デバッガーの画像を配置して、変数の実行時の型を示します。

異常なリターン タイプ

4

3 に答える 3

2

asignacion.id_nivelおよびasignacion.id_asignatura動的タイプです。

動的な型を引数として任意のメソッドに渡すと、メソッドの戻り値の型は、MSDN の記述ではなく動的になります。動的型では拡張メソッドを使用できません。Count()の拡張メソッドEnumerableです。そのため、例外が発生します。

この問題を解決して戻り値の型を Enumerable に戻す方法は 2 つあります。1 つ目は、明示的に定義することです。

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

もう 1 つは、パラメーターを動的でない型にキャストすることです。

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

Knox が指摘しているように、string.Format ではなくパラメーターを使用する必要があります。

于 2013-03-30T19:00:41.053 に答える
0

ハビリダードともう一方のハビリダードにはデータがありますか? db.Query が null を返している、つまり行が返されていない可能性があると思います。null には実行するオブジェクトがないため、habilidades.Count を実行できません。これをデバッガーの外でテストする 1 つの方法は、db.QueryValue( "Select Count(*) from ...") を実行し、ゼロ行が返されるかどうかを確認することです。

ところで、C# のデータベース関数は、変数処理をあなたよりも少し短い方法で組み込みます。あなたは書ける

var ejes = db.Query( @"
        Select *  
        From asign  
        Where id_nivel = @0",   
        asignacion.id_nivel );  

この手法は、パラメーター化された SQL と呼ばれます。ここでは 1 つのパラメーターのみを示していますが、さらに多くのパラメーターが必要になります。@0、@1、@2 などは String.Format と同じように置き換えられます。

于 2013-03-30T15:36:53.147 に答える
0

違いは、デバッガーが困難であるためです
( var c_dif = dificultades.Count();)。
他の 2 つの変数はまだ評価されていません (linq deferred)。したがって、デバッガーは困難についてより多くのことを知っています。

于 2013-03-29T21:08:45.680 に答える