0

我在我的 ASP.NET MVC3 应用程序中运行查询以从数据库中获取一些数字:

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

但是,动态列有时是 int 类型int,有时是long. 我试过long了,因为它涵盖了 int,但程序抛出了异常:

从具体化的“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”类型。

我可以做些什么来为ints 和longs 运行我的查询?获取动态类型并将它们转换为对我来说很长的工作的方法,我可以在下面的代码行中使用 idItems。

4

2 回答 2

0

Try plain old 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,我首先得到 long,然后我得到 int 并将它们转换为 long。如果我有一个动态类型,我总是会进行转换。所以如果我的类型很长(通常是),我没有不必要的转换,我认为这更快。

于 2013-01-12T22:38:41.390 回答