我是第一次尝试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。
时,表结构看起来更干净答案 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;