我有以下查询:
SELECT
[Person].[Id] AS [Person_Id],
[Person].[Name] AS [Person_Name],
[Address].[Id] AS [Address_Id],
[Address].[Number] AS [Address_Number],
[Address].[Street] AS [Address_Street],
FROM [Person]
LEFT JOIN [Address] ON [Person].[addressId] = [Address].[Id]
用于查询SQLite
内存数据库中的内容:
var rows = _database.Query(query);
但是,当我尝试将值读为Int32
时,我得到InvalidCastException
。
foreach (IDictionary<string, object> row in rows)
{
var someId = (int)row["Person_Id"];
var someNumber = (int)row["Address_Number"];
}
我之所以使用dapper
,是因为作为一个辅助项目,我在dapper
之上构建了一些功能,以将值映射到POCO
(我知道类似的项目,例如rainbow
,dapper.extensions
等。
这就是:
var rowVal = row[fieldName];
propInfo.SetValue(obj, rowVal, null);
再次,忽略与反射调用相关的性能成本。
在上面的示例中,POCO
的属性类型为int32
,由于此问题,我无法将值分配给obj
。
非常感谢任何帮助或想法。
答案 0 :(得分:5)
它不是Dapper,它是SQLite。请参阅Datatypes In SQLite Version 3(假设您实际上正在使用v3):
例如,INTEGER存储类包含6种不同长度的不同整数数据类型。这在磁盘上有所不同。 B ut一旦从磁盘读取INTEGER值并进入内存进行处理,它们就会转换为最通用的数据类型(8字节有符号整数)。因此,在大多数情况下,&#34;存储类&#34;与&#34;数据类型&#34;无法区分这两个术语可以互换使用。