我在我的ASP中运行查询。. NET MVC3应用程序从数据库中获取一些数字:
var idQuery = "SELECT " + dynamicColumnName + " FROM " + dynamicTableName;
long[] idItems = db.Database.SqlQuery<long>(idQuery).ToArray();
但是,动态列有时是int类型的int
,有时是long
。我尝试了long
,因为它涵盖了int,但程序抛出了异常:
来自物化'系统'的指定强制类型。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' to type 'System.IConvertible'
我能做些什么来工作我的查询运行int
s和long
s?对于获取动态类型并将其转换为长工作的方法,我可以在下面的代码行中使用idItems。
试试普通的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]);
}
我得到了一个没有动态类型的解决方案:
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]);
}
}
首先得到long,如果类型是int,然后得到int并将其转换为long。如果我有一个动态类型,我总是会做转换。因此,如果我的类型是长(通常是),我没有不必要的转换,我认为这是更快的。