Comment puis-je utiliser Dapper avec une procédure stockée SELECT contenant une INNER JOIN entre deux tables?

.net c# dapper

Question

J'expérimente Dapper pour la première fois. J'ai deux tableaux: Films et évaluations.

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 
)

J'ai écrit une procédure stockée qui renverra tous les films de la table Films et se joindra à la table des notes. Dapper fonctionne facilement lorsque la table est structurée avec le même nom entre le FK et le PK des tables.

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

Lorsque ma requête est exécutée, l'objet film est instancié correctement, mais le paramètre RatingId est défini sur 0 (car la valeur par défaut est 0). La propriété rating contient le nom, mais l'ID a également été défini sur 0.

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

Comment puis-je exécuter ma requête Dapper avec succès et obtenir les résultats exacts dont j'ai besoin lorsque les noms de colonne ne sont pas identiques, comme dans mon exemple? La structure de la table me semble plus propre lorsque mes colonnes s'appellent Ratings.Id au lieu de Ratings.RatingId.

Réponse acceptée

Dapper va essayer de mapper la propriété pour la propriété au point où vous commencez à diviser. Vous voulez que votre requête ressemble à ce qui suit, et vous pouvez abandonner le splitOn puisque vous divisez sur 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;



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