Подтвердить что ты не робот

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

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

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

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();
        }
4b9b3361

Ответ 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>() относится к сетке последовательных результатов.