新手來了 我有以下 2 個表。一張專輯:

另一個用于歌曲:

所以所有這些歌曲都屬于“Freedom”專輯。在 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();
}
它只說:Incorrect syntax near the keyword 'JOIN'。
uj5u.com熱心網友回復:
您連接表的方式有誤。先加入,再過濾(where-part)
正確的查詢應該是這樣的
SELECT *
FROM Albums a
JOIN Songs s
ON s.AlbumId = a.Id
WHERE a.Id = @AlbumId;
更新。由于您僅在第二個查詢中查找歌曲,因此從您的表場景中我看到這里不需要 join。您已經將專輯.id 傳遞給查詢。試試這個,讓我知道結果
SELECT *
FROM Songs s
WHERE s.AlbumId = @AlbumId;
uj5u.com熱心網友回復:
嘗試按如下方式更改您的連接查詢:
SELECT a.* FROM Albums as a inner join Songs as s on s.AlbumId = a.Id WHERE a.Id = @AlbumId
uj5u.com熱心網友回復:
您需要使用 Dapper 的連接語法。我假設您有一個 Song 類,我還假設您的 Album 建構式創建了 Songs 串列。然后你會像下面那樣做,你告訴 dapper 期待專輯和歌曲并回傳專輯。資料應該從歌曲的 Id 上拆分,這就是 splitOn 引數的用途。這是從記憶中輸入并且缺少資訊,因此可能需要進行一些調整。
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....
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376753.html
標籤:C# sql sql-server 小巧玲珑
上一篇:發生錯誤1042:連接超時已過期
