Как сопоставить несколько записей из одного SP с помощью Dapper-dot-net

Я хотел бы использовать Dapper в ситуации, когда выполнение одной хранимой процедуры вернет 50 нескольких отдельных выборок, ни один из отдельных наборов результатов не будет очень широким, максимум 20 или 30 столбцов. Приведенный ниже код взят из Dapper Tests, и мне интересно, является ли этот пример хорошим прототипом для использования.

Спасибо, Стивен

public void TestMultiMap()
        {
            var createSql = @"
                create table #Users (Id int, Name varchar(20))
                create table #Posts (Id int, OwnerId int, Content varchar(20))

                insert #Users values(99, 'Sam')
                insert #Users values(2, 'I am')

                insert #Posts values(1, 99, 'Sams Post1')
                insert #Posts values(2, 99, 'Sams Post2')
                insert #Posts values(3, null, 'no ones post')";

                connection.Execute(createSql);

            var sql = @"select * from #Posts p 
                      left join #Users u on u.Id = p.OwnerId 
                      Order by p.Id";

            var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
            var p = data.First();

            p.Content.IsEqualTo("Sams Post1");
            p.Id.IsEqualTo(1);
            p.Owner.Name.IsEqualTo("Sam");
            p.Owner.Id.IsEqualTo(99);

            data[2].Owner.IsNull();

           connection.Execute("drop table #Users drop table #Posts");
    }

РЕДАКТИРОВАТЬ

Вот пример, основанный на ответе Марка.

        const string sql = @"__sp_GetMISMOLoanInfo";
        using (var multi = _connection.QueryMultiple(sql, new { loannum = "3192381" }, commandType: CommandType.StoredProcedure))
        {
           var address = multi.Read<ADDRESS>().Single();
           var amortizationRule = multi.Read<AMORTIZATION_RULE>().Single();
           var appraiserLicense = multi.Read<APPRAISER_LICENSE>().Single();
           var automatedUnderwriting = multi.Read<AUTOMATED_UNDERWRITING>().Single();
           var avm = multi.Read<AVM>().Single();
           var borrowerDetail = multi.Read<BORROWER_DETAIL>().Single();
        }

person Stephen Patten    schedule 19.07.2011    source источник
comment
Где СП? В частности, это широкий результат или несколько отдельных выборок? Оба работают с dapper, но синтаксис этих двух макетов различается.   -  person Marc Gravell    schedule 19.07.2011
comment
(Я знаю, что это был просто пример, но табличная переменная могла бы быть лучше, кстати)   -  person Marc Gravell    schedule 19.07.2011
comment
Марк, я отредактировал сообщение, чтобы отразить ваши вопросы.   -  person Stephen Patten    schedule 19.07.2011
comment
См. codeproject.com/Articles/835519/ для обертки, упрощающей задачу   -  person Yulia V    schedule 25.01.2016


Ответы (1)


Это с домашней страницы, но в тестах должно быть похоже:

var sql = @"...";
using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 

Аргументы и т. д. работают как обычно и должны напрямую сопоставляться с определенными именами параметров, если указан CommandType.

Каждый вызов .Read<T>() относится к сетке последовательных результатов.

person Marc Gravell    schedule 19.07.2011
comment
Марк, как передать параметр? Процедура или функция '__sp_GetMISMOLoanInfo' ожидает параметр '@loannum', который не был предоставлен. - person Stephen Patten; 19.07.2011
comment
@SPATEN вы передали, например, new {loannum = yourValue} ? - person Marc Gravell; 19.07.2011
comment
Да, точно так же, как код, который я вставил как EDIT. Я даже установил его как строку, потому что это наш тип данных «Номер займа». СОЗДАТЬ ПРОЦЕДУРУ [dbo].[__sp_GetMISMOLoanInfo] @loannum varchar(15) - person Stephen Patten; 19.07.2011
comment
Проблема заключалась НЕ в установке CommandType, как указал Марк. Задача решена. - person Stephen Patten; 19.07.2011