2014-09-19 62 views
1

我正在使用:ASP.NET MVC,MySql,Dapper.NET微-orm 我用3个SELECT做了一个存储过程,其中两个返回列表,第三个返回一个整数。dapper querymultiple spliton error

这里是我的代码:

using (var conn = new MySqlConnection(GetConnectionString())) 
{ 
    var readDb = conn.QueryMultiple(storedProcedure, parameters, commandType: CommandType.StoredProcedure); 

    var result = new someView 
    { 
     TopicsList = readDb.Read<ITopic>().ToList(), 
     TopTopicsList = readDb.Read<IMessage>().ToList(), 
     TopicsCount = readDb.Read<int>().Single() 
    }; 

    return result; 
} 

在ITopic我TopicId,在即时聊天我的MessageId。

而这里的错误:

When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id Parameter name: splitOn 

我试过两个QueryMultiple和读取加入splitOn,慢慢靠近连在一起接受了它。

虽然我不明白为什么我需要splitOn?不能缩小看到我有三个单独的SELECT?当分别对每个选择使用conn.Read(storedProcedure,参数)(而不是所有的多重查询)时,dapper将它映射到给定对象没有问题。

我在做什么错?

+0

这应该工作。我会看看我是否可以在本地复制。我的第一个想法是“你确定它会返回3格吗?” – 2014-09-19 17:25:25

+0

是的,我确定,通过在phpMyAdmin上运行存储过程来检查它,它返回三个表。我也嘲笑每个选择单独和他们都工作,但他们三个一起使用querymultiple仍然失败,同样的错误 – shahaf 2014-09-19 17:35:26

回答

2

1)问题时,我使用的真正型号名称,而不是它们的接口的名字解决:

TopicView代替ITopic,TopTopicsView而不是即时聊天;

2)一旦是固定的,不再有“无splitOn”的错误,开始与< int>的排队铸造另一个问题:

TopicsCount = readDb.Read<int>().Single() 

可能mysql的犯规数回归早在整数?

我尝试使用小数,对象,动态等..没有运气。最终通过创建另一个带有int属性的Model来修复它,它具有与数据库int参数相同的名称,现在它可以工作。

3)这里是最后的工作代码:

using (var conn = new MySqlConnection(GetConnectionString())) 
{ 
    var parameters = context.MapEntity(query); 

    var multi = conn.QueryMultiple(storedProcedure, parameters, commandType: System.Data.CommandType.StoredProcedure); 

    var TopicsList = multi.Read<TopicView>().ToList(); 
    var TopTopicsList = multi.Read<TopTopicsView>().ToList(); 
    var result = multi.Read<HomeView>().Single(); 

    result.TopicsList = TopicsList; 
    result.TopTopicsList = TopTopicsList; 

    return result; 
} 
+0

MySQL的确很热衷于使用'长' – 2014-09-22 13:21:58