如何将 Dapper 与包含两个表之间的 INNER JOIN 的 SELECT 存储过程一起使用?

How can I use Dapper with a SELECT stored procedure containing an INNER JOIN between two tables?

我是第一次尝试 Dapper。我有两个 table:电影和评级。

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 
)

我已经编写了一个存储过程,它将 return 电影 table 中的所有电影并加入评级 table。当我在 table 的 FK 和 PK 之间使用相同的名称构造 table 时,Dapper 很容易工作。

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

当我的查询 运行s 时,电影对象被正确实例化,但 RatingId 被设置为 0(因为 int 默认为 0)。评分 属性 包含名称,但 Id 也设置为 0。

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

当列名与我的示例不同时,我如何才能成功 运行 我的 Dapper 查询并获得我需要的准确结果?当我将列命名为 Ratings.Id 而不是 Ratings.RatingId.

时,Table 结构对我来说看起来更清晰

Dapper 会在您开始拆分时尝试将 属性 映射到 属性。您希望您的查询如下所示,并且您可以放弃 splitOn,因为您正在拆分 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;