两个表:
+-Person-+ +--Rank--+
| Id | | Id |
| FName | | Name |
| LName | +--------+
| Rank |
+--------+
对象模型的外观完全相同,只是“在人员中的等级”是RankModel类型而不是int类型。
我对它们进行了简单的内部联接:
string sql = "SELECT pe.Id, pe.LName, pe.FName, pe.Rank, ra.Id, ra.Name" +
"FROM Person pe INNER JOIN Rank ra ON ra.Id = pe.Rank";
然后我使用Dapper进行映射:
return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
{
per.Rank = rank;
return per;
}).ToList();
但我有一个例外:
InvalidCastException: Invalid cast from 'System.Int16' to 'MainDB.Models.RankModel'.
很显然,它正在尝试将int转换为RankModel,但是我不知道为什么-应该将返回值分成两个对象,然后将RankModel对象附加到PersonModel对象的Rank属性中。这让我发疯,我已经花了3个小时来弄清楚发生了什么。
答案 0 :(得分:2)
您需要在查询语句中添加'splitOn'参数,以便将其拆分为Person,Rank模型对象。
另外,您的sql需要如下重构
string sql = "SELECT pe.Id, pe.LName, pe.FName, ra.Id, ra.Name" +
"FROM Person pe INNER JOIN Rank ra ON ra.Id = pe.Rank";
您的声明应为
return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
{
per.Rank = rank;
return per;
}, splitOn:"Id,Id").ToList();