¿Cómo puedo usar Dapper con un procedimiento almacenado SELECT que contiene una UNIÓN INTERNA entre dos tablas?

.net c# dapper

Pregunta

Estoy experimentando con Dapper por primera vez. Tengo dos tablas: películas y calificaciones.

CREATE TABLE [dbo].[Films]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Title] VARCHAR(250) NOT NULL, 
    [Genre] VARCHAR(50) NOT NULL, 
    [RatingId] INT NOT NULL, 
    CONSTRAINT [FK_Films_To_Ratings] FOREIGN KEY (RatingId) REFERENCES Ratings(Id)
)

CREATE TABLE [dbo].[Ratings]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Name] VARCHAR(50) NOT NULL 
)

He escrito un procedimiento almacenado que devolverá todas las películas en la tabla de películas y se unirá a la tabla de calificaciones. Dapper funciona fácilmente cuando tengo la tabla estructurada con el mismo nombre entre el FK y PK de las tablas.

CREATE PROCEDURE [dbo].[GetFilms]
AS
BEGIN
    SELECT
        F.Id,
        F.Title,
        F.Genre,
        F.RatingId,
        R.Name
    FROM
        dbo.Films as F
    INNER JOIN
        dbo.Ratings as R
    ON
        F.RatingId = R.Id;
END

Cuando se ejecuta mi consulta, el objeto de la película se crea una instancia correctamente, pero el RatingId se estableció en 0 (ya que int por defecto es 0). La propiedad de calificación contiene el nombre, pero el Id también se estableció en 0.

return this._db.Query<Film, Rating, Film>(
            "dbo.GetFilms",
            (f, r) =>
            {
                f.Rating = r;
                return f;
            },
            splitOn: "RatingId",
            commandType: CommandType.StoredProcedure
            ).ToList();

¿Cómo puedo ejecutar con éxito mi consulta Dapper y obtener los resultados exactos que necesito cuando los nombres de las columnas no son idénticos a los de mi ejemplo? La estructura de la tabla me parece más limpia cuando tengo columnas llamadas Ratings.Id en lugar de Ratings.RatingId.

Respuesta aceptada

Dapper intentará mapear la propiedad para el momento en que empiece a dividirse. Desea que su consulta se vea como la siguiente, y puede eliminar el splitOn ya que se está dividiendo en Id .:

    SELECT
            F.Id,
            F.Title,
            F.Genre,
--Rating object starts here
            R.Id,
            R.Name
        FROM
            dbo.Films as F
        INNER JOIN
            dbo.Ratings as R
        ON
            F.RatingId = R.Id;


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é