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

时间:2015-03-13 19:12:31

标签: c# .net dapper

我是第一次尝试Dapper。我有两张桌子:电影和评级。

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 
)

我编写了一个存储过程,它将返回Films表中的所有电影并与Ratings表连接。当我使用表格的FK和PK之间的相同名称构建表格时,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

当我的查询运行时,电影对象会被正确实例化,但是RatingId被设置为0(因为int默认为0)。 rating属性包含名称,但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。

时,表结构看起来更干净

1 个答案:

答案 0 :(得分:4)

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;