Ne pouvez pas obtenir multi-cartographie de travailler dans Dapper
Jouer avec Dapper, je suis très heureux avec les résultats de la mesure - intrigants!
Mais maintenant, mon prochain scénario serait de lire les données de deux tables - un Student
et un Address
table.
Student
table possède une clé primaire de StudentID (INT IDENTITY)
, Address
a un AddressID (INT IDENTITY)
. Student
a aussi un FK appelé AddressID
de la liaison dans le Address
table.
Mon idée était de créer deux classes, une pour chaque table, avec les propriétés que je suis intéressé. En outre, j'ai mis une PrimaryAddress
propriété de type Address
sur mon Student
classe en C#.
J'ai ensuite essayé de récupérer à la fois des étudiants et des données d'adresse en une seule requête - je imiter l'exemple qui est donné sur le Page Github:
var data = connection.Query<Post, User>(sql, (post, user) => { post.Owner = user; });
var post = data.First();
Ici, un Post
et un User
sont récupérés, et le propriétaire de la poste est défini pour l'utilisateur, le type retourné est un Post
- il correct?
Donc dans mon code, j'définir deux paramètres pour le générique Query
méthode d'extension - un Student
que le premier qui doit être retourné, et un Address
que le second, qui seront stockées sur l'étudiant exemple:
var student = _conn.Query<Student, Address>
("SELECT s.*, a.* FROM dbo.Student s
INNER JOIN dbo.Address a ON s.AddressID = a.AddressID
WHERE s.StudentenID = @Id",
(stu, adr) => { stu.PrimaryAddress = adr; },
new { Id = 4711 });
Problème est - j'obtiens une erreur dans Visual Studio:
À l'aide de la méthode générique
'Dapper.SqlMapper.Requête(Système D'.Les données.IDbConnection,
chaîne,
Système.Func,
dynamique du Système.Les données.IDbTransaction,
bool, string, int?,
Système.Les données.CommandType?)' nécessite 6
les arguments de type
Je ne comprends vraiment pas pourquoi Dapper insiste sur l'utilisation de cette surcharge avec 6 arguments de type...
OriginalL'auteur marc_s | 2011-05-14
Vous devez vous connecter pour publier un commentaire.
Qui serait cause que j'ai changé d'Api et j'ai oublié de mettre à jour la documentation, j'ai corrigé l'erreur.
Assurez-vous d'avoir un coup d'oeil à Les Tests.cs pour un full up-to-date de la spec.
En particulier, l'ancienne API utilisé dans un
Action<T,U>
pour effectuer la cartographie, le problème était qu'il se sentait à la fois arbitraire et inflexible. Vous ne pouvez pas pleinement contrôler le type de retour. La nouvelle Api de prendre dans unFunc<T,U,V>
. Ainsi, vous pouvez contrôler le type que vous obtenez de retour à partir du mappeur et il n'a pas besoin d'être un mappage de type.J'ai juste attaché une flexibilité supplémentaire autour de multi cartographie, ce test devrait préciser:
Dapper tuyaux multi cartographie des Api grâce à une méthode unique, donc si quelque chose échoue il va finir dans les 6 param. L'autre pièce du puzzle que je n'ai pas de tenir compte de certaines super flexible de fentes, de qui j'ai simplement ajouté.
Note, le
splitOn
param par défautId
, signifie qu'elle va prendre une colonne appeléeid
ouId
comme le premier objet de la frontière. Toutefois, si vous avez besoin de limites sur plusieurs clés primaires qui ont des noms différents pour dire un "3 way" multi mappage, vous pouvez maintenant passer une liste séparée par des virgules.Donc, si nous devions fixer le ci-dessus, probablement la suivante devrait fonctionner:
StudentId = @Id
(et puis définissez@ID = 4711
) pour ce multi-cartographie de la requête??édité que dans ...
gardez à l'esprit il ya une tonne d'option paramètres de contrôle des trucs comme type de commande, le délai d'expiration de commandes et ainsi de suite. un élément vraiment important d'apprendre est "tampon" qui permet de tamponner les résultats de sorte que vous n'avez pas SqlReaders marcher sur les autres
il serait assez facile (je pense) pour en faire un backport (probablement pour la 2.0 si nécessaire) par l'intermédiaire de compilateur symboles. Nous pouvons également (IIRC) configurer nuget pour délivrer la bonne dll. (dit le fou qui a en parallèle soutien pour le c# 1.2 vers le haut, sur plusieurs types de Bcl/CLIs pour pb-net)
Gravel, @Sam Safran: YAY ! Un NuGet, alimentées .NET 2, par .NET 4 compatible Dapper - c'est déjà Noël? 🙂
OriginalL'auteur