Какая разница в производительности при передаче объекта?

Поэтому в последнее время я использовал dapper для нескольких своих проектов, и мне было любопытно, есть ли разница в производительности между следующими образцами:

С объектом со многими свойствами 30+ есть ли какая-то польза от явного указания свойств, а не просто для того, чтобы он сам разбирался в этом?

Опция 1:

string sqlQuery = @"INSERT INTO [PTTicket]
                                     ([Id])
                               VALUES
                                     (@Id)";
con.Execute(sqlQuery, ptTicket);

Вариант 2:

string sqlQuery = @"INSERT INTO [PTTicket]
                                     ([Id])
                               VALUES
                                     (@Id)";
con.Execute(sqlQuery, 
                     new 
                     { 
                         ptTicket.Id 
                     }

Мне просто любопытно, есть ли какая-то польза от ручного предоставления значений или если я могу просто передать объект и позволить Дапперу получить его.

Тем более, что список начинает расти:

Вариант 1б

string sqlQuery = @"INSERT INTO [PTTicket]
                                         ([Id]
                                         ,[Name]
                                         ,[SMState]
                                         ,[CreatedByMember]
                                         ,[StartDate]
                                         ,[ClosedDate]
                                         ,[Remarks])
                                   VALUES
                                         (@Id
                                         ,@Name
                                         ,@SMState
                                         ,@CreatedByMember
                                         ,@StartDate
                                         ,@ClosedDate
                                         ,@Remarks)";
con.Execute(sqlQuery, ptTicket);

Вариант 2б.

string sqlQuery = @"INSERT INTO [PTTicket]
                                       ([Id]
                                       ,[Name]
                                       ,[SMState]
                                       ,[CreatedByMember]
                                       ,[StartDate]
                                       ,[ClosedDate]
                                       ,[Remarks])
                                 VALUES
                                       (@Id
                                       ,@Name
                                       ,@SMState
                                       ,@CreatedByMember
                                       ,@StartDate
                                       ,@ClosedDate
                                       ,@Remarks)";
con.Execute(sqlQuery,
                    new
                    {
                        ptTicket.Id,
                        ptTicket.Name,
                        ptTicket.SMState,
                        ptTicket.CreatedByMember,
                        ptTicket.StartDate,
                        ptTicket.ClosedDate,
                        ptTicket.Remarks
                    });

1 ответ

Решение

В случае встроенного TSQL, нет, они должны быть примерно одинаковыми. Даппер делает небольшую проверку команды, чтобы решить, какие свойства отправлять, но она довольно проста. Если у вас был комментарий, как:

-- phew, it is a good job we didn't pass in @LongDescription, because
-- that could be 2GB in size!

тогда этого может быть достаточно, чтобы сделать более щадящую отправку .LongDescription,

Если вы используете хранимые процедуры, то такая проверка невозможна, поэтому она отправит все, что увидит.

Другие вопросы по тегам