我是新手。我有以下两张桌子。一张专辑:
另一个是歌曲:
所以所有这些歌曲都属于“自由”专辑。在api调用中,我使用dapper显示所有相册,这很好。
[HttpGet("[action]/{id}")]
public async Task<IActionResult> GetSingleAlbumViaDapper(int id)
{
var sql = "SELECT * FROM Albums WHERE Id = @AlbumId";
var album = (await _dbDapper.QueryAsync<Album>(sql, new { AlbumId = id })).SingleOrDefault();
}
结果如下:
但是我想加入这张专辑的相关歌曲。我试过以下方法,但不起作用,你知道为什么吗?
[HttpGet("[action]/{id}")]
public async Task<IActionResult> GetSingleAlbumViaDapper(int id)
{
var sql = "SELECT * FROM Albums WHERE Id = @AlbumId JOIN Songs in Songs on Albums.Songs";
var album = (await _dbDapper.QueryAsync<Album>(sql, new { AlbumId = id })).SingleOrDefault();
}
它只是说:关键字'JOIN'
附近的语法不正确。
如何联接表时出错。首先连接,然后筛选(其中部分)
正确的查询应该是这样的
SELECT *
FROM Albums a
JOIN Songs s
ON s.AlbumId = a.Id
WHERE a.Id = @AlbumId;
UPD。因为您只在第二个查询中查找歌曲,所以从您的表scema我看到这里不需要join。您已将album.id传递给查询。试试这个,告诉我结果
SELECT *
FROM Songs s
WHERE s.AlbumId = @AlbumId;
尝试更改连接查询如下:
SELECT a.* FROM Albums as a inner join Songs as s on s.AlbumId = a.Id WHERE a.Id = @AlbumId
您需要使用Dapper的连接语法。我假设你有一个歌曲类,我还假设你的相册构造函数创建了歌曲列表。然后你会像下面这样做,告诉衣冠楚楚的人期待专辑和歌曲,并返回一张专辑。数据应该从歌曲的id上拆分,这就是拆分参数的作用。这是从内存中键入的,缺少信息,所以可能需要一些调整。
var sql = "SELECT * FROM Albums AS a INNER JOIN Songs AS s ON s.AlbumId = a.Id WHERE a.Id = @AlbumId";
Album foundAlbum = null;
var album = (await _dbDapper.QueryAsync<Album, Song, Album>(sql, (album, song) =>
{
if (foundAlbum is null)
{
foundAlbum = album;
}
foundAlbum.Songs.Add(song);
return album;
}, splitOn : "Id", new { AlbumId = id })).SingleOrDefault();
// Use foundAlbum here....