Как отобразить несколько записей с одного SP с помощью Dapper-dot-net - PullRequest
11 голосов
/ 19 июля 2011

Я хотел бы использовать 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");
    }

EDIT

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

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

1 Ответ

22 голосов
/ 19 июля 2011

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

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

...