Dapper multiselect: la clé primaire de la classe imbriquée ne mappe pas à moins d'utiliser "AS"

.net c# dapper sql

Question

J'ai deux cours:

class Foo{
    public int FooId { get; set; }
    ...
    public Bar Bar { get; set }
}

class Bar{
    public int BarId { get; set; }
    public int FooId { get; set }
    ...
}

quand je lance alors la requête comme ceci:

sqlConnection.Query<Foo, Bar, Foo>(
    "SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
    (foo, bar) => { 
         foo.Bar = bar;
         return foo; 
       }, 
    splitOn: "FooId");

le résultat serait alors que toutes les propriétés à la fois sur Foo et sur Bar seront mises en correspondance, sauf pour Bar.BarId. Après avoir vérifié le nom de la colonne et saisi la base de données par rapport à ma classe Bar, je n'ai toujours pas trouvé de différence.

Une chose étrange sur laquelle je suis tombé est que si je écrivais:

"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"

Bar.BarId a été mappé comme prévu, ai-je mal compris comment utiliser Dapper ou est-ce un bug?

Réponse acceptée

Il essaie de faire une division sur FooId , donc chaque fois qu'il voit FooId il coupe les données. Ce cas d'utilisation est essentiellement destiné au scénario (pas rare) où toutes les tables ont une clé prévisible telle que Id . Dans votre cas, ce n'est pas ce que vous voulez, car vous obtenez de la base de données:

FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^

Cependant, cela se divise sur FooId comme:

FooId, a, b, c, BarId | FooId, x, y, z

c'est pourquoi BarId n'est pas inclus dans le second objet, et aussi pourquoi l'ajouter à la fin le fait fonctionner.

Il y a une autre utilisation, IIRC, qui accepte les clés séquencées pour se séparer; vous utiliseriez:

splitOn: "FooId,BarId"



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