如何将 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;
我是第一次尝试 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;