Une différence de performance époustouflante lorsque vous passez l'objet?

.net c# dapper micro-orm orm

Question

J'ai donc utilisé dapper pour quelques-uns de mes projets ces derniers temps et j'étais curieux de savoir s'il y avait une différence de performance entre les exemples suivants:

Avec un objet avec de nombreuses propriétés 30+, y a-t-il un avantage à énoncer explicitement les propriétés plutôt que de les laisser se débrouiller toutes seules?

Option 1:

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

Option 2:

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

Je suis simplement curieux de savoir s'il est avantageux de fournir manuellement les valeurs ou si je peux simplement passer l'objet et laisser Dapper se débrouiller.

Surtout que la liste commence à croître:

Option 1b

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

Option 2b.

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

Réponse acceptée

Dans le cas de TSQL en ligne, non, ils devraient être à peu près les mêmes. Dapper effectue une brève inspection de la commande pour décider des propriétés à envoyer, mais c'est assez simple. Si vous aviez un commentaire comme:

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

alors cela pourrait être suffisant pour que dapper envoie .LongDescription .

Si vous utilisez des procédures stockées, aucune inspection de ce type n'est possible, elle enverra donc tout ce qu'elle peut voir.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi