0

ASP.NET MVC3アプリケーションでクエリを実行して、データベースからいくつかの数値を取得しています。

var idQuery = "SELECT " + dynamicColumnName + " FROM " + dynamicTableName;
long[] idItems = db.Database.SqlQuery<long>(idQuery).ToArray();

ただし、動的列はint型intの場合もあれば、。の場合もありlongます。intをカバーしているので試しlongましたが、プログラムは例外をスローしました:

マテリアライズされた「System.Int32」タイプから「System.Int64」タイプへの指定されたキャストは無効です。

タイプを試しましたdynamicが、数字を正しく取得できませんでした。

dynamic[] idItems = db.Database.SqlQuery<dynamic>(idQuery).ToArray();
long[] idItemsLong = new long[idItems.Length];
for (int i = 0; i < idItemsLong.Length; i++)
{
    idItemsLong[i] = Convert.ToInt64(idItemsLong[i]);
}

例外をスローします:

タイプ「System.Object」のオブジェクトをタイプ「System.IConvertible」にキャストできません。

intとの両方でクエリを実行するにはどうすればよいlongですか?動的型を取得して長いものに変換する方法は、次のコード行でidItemsを使用できる限り使用できます。

4

2 に答える 2

0

昔ながらの方法を試してくださいobject

object[] idItems = db.Database.SqlQuery<object>(idQuery).ToArray();
long[] idItemsLong = new long[idItems.Length];
for (int i = 0; i < idItemsLong.Length; i++)
{
    idItemsLong[i] = Convert.ToInt64(idItems[i]);
}
于 2013-01-12T19:45:21.493 に答える
0

動的タイプなしで機能するソリューションが得られました。

long[] idItems = new long[1];
long[] valueItems = new long[1];

try
{
    idItems = db.Database.SqlQuery<long>(idQuery).ToArray();
    valueItems = db.Database.SqlQuery<long>(valueQuery).ToArray();
}
catch (Exception e)
{
    int[] idItemsInt = db.Database.SqlQuery<int>(idQuery).ToArray();
    int[] valueItemsInt = db.Database.SqlQuery<int>(valueQuery).ToArray();
    idItems = new long[idItemsInt.Length];
    valueItems = new long[idItemsInt.Length];
    for (int i = 0; i < idItems.Length; i++)
    {
        idItems[i] = Convert.ToInt64(idItemsInt[i]);
        valueItems[i] = Convert.ToInt64(valueItemsInt[i]);
    }
}

これにより、型がintの場合、intを取得してlongに変換するよりも、最初にlongを取得します。動的タイプの場合、常に変換を行います。ですから、私のタイプが長い場合(一般的にはそうです)、不必要な変換はなく、これはより速いと思います。

于 2013-01-12T22:38:41.390 に答える