Multiplexor Dapper: la clave primaria de clase anidada no se correlaciona a menos que se use "AS"

.net c# dapper sql

Pregunta

Tengo dos clases:

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

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

cuando luego ejecuto la consulta de esta manera:

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

el resultado sería que todas las propiedades en Foo y Bar se correlacionarán Excepto Bar.BarId. Después de verificar el nombre de columna y escribir en la base de datos contra mi clase de Bar, aún no pude encontrar ninguna diferencia.

Una cosa extraña que encontré fue que si escribía:

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

Bar.BarId realmente mapeado como se esperaba, ¿he entendido mal cómo usar Dapper o es un error?

Respuesta aceptada

Está tratando de hacer una división en FooId , por lo que cada vez que ve FooId está recortando los datos. Este caso de uso está destinado esencialmente al escenario (no poco común) en el que todas las tablas tienen una clave predecible, como Id . En su caso, esto no es lo que quiere, ya que obtiene de la base de datos:

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

Sin embargo, eso se divide en FooId como:

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

por eso BarId no se incluye en el segundo objeto, y también por qué agregarlo al final lo hace funcionar.

Hay otro uso, IIRC, que acepta las claves secuenciadas para dividir; usarías:

splitOn: "FooId,BarId"


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué