Dapperのマルチマッピング機能を使用して、アルバムのリストと、関連するアーティストとジャンルを返します。
public class Artist
{
public virtual int ArtistId { get; set; }
public virtual string Name { get; set; }
}
public class Genre
{
public virtual int GenreId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
public class Album
{
public virtual int AlbumId { get; set; }
public virtual int GenreId { get; set; }
public virtual int ArtistId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
var query = @"SELECT AL.Title, AL.Price, AL.AlbumArtUrl, GE.Name, GE.[Description], AR.Name FROM Album AL INNER JOIN Genre GE ON AL.GenreId = GE.GenreId INNER JOIN Artist AR ON AL.ArtistId = AL.ArtistId";
var res = connection.Query<Album, Genre, Artist, Album>(query, (album, genre, artist) => { album.Genre = genre; album.Artist = artist; return album; }, commandType: CommandType.Text, splitOn: "ArtistId, GenreId");
私はこれに関する解決策をチェックしましたが、それは機能しませんでした。誰が私がどこを間違えたか教えてください。
ありがとう@Alex :)しかし、私はまだ打たれています。これは私がやったことです:
CREATE TABLE Artist
(
ArtistId INT PRIMARY KEY IDENTITY(1,1)
,Name VARCHAR(50)
)
CREATE TABLE Genre
(
GenreId INT PRIMARY KEY IDENTITY(1,1)
,Name VARCHAR(20)
,[Description] VARCHAR(1000)
)
CREATE TABLE Album
(
AlbumId INT PRIMARY KEY IDENTITY(1,1)
,GenreId INT FOREIGN KEY REFERENCES Genre(GenreId)
,ArtistId INT FOREIGN KEY REFERENCES Artist(ArtistId)
,Title VARCHAR(100)
,Price FLOAT
,AlbumArtUrl VARCHAR(300)
)
INSERT INTO Artist(Name) VALUES ('Jayant')
INSERT INTO Genre(Name,[Description]) VALUES ('Rock','Originally created during school days. The year was.....I guess 1998')
DECLARE @gen_id INT
,@art_id INT
SET @gen_id = (SELECT MAX(GenreId) FROM Genre)
SET @art_id = (SELECT MAX(ArtistId) FROM Artist)
INSERT INTO Album(GenreId,ArtistId,Title,Price,AlbumArtUrl) VALUES (@gen_id,@art_id,'I go mad for you',200,'http://asha4u.com/IGoMad')
あなたが提案したように、私はクエリを次のように変更しました:
var query = @"SELECT AL.AlbumId, AL.Title, AL.Price, AL.AlbumArtUrl, GE.GenreId, GE.Name, GE.Description, AR.ArtistId, AR.Name FROM Album AL INNER JOIN Artist AR ON AR.ArtistId = AL.ArtistId INNER JOIN Genre GE ON GE.GenreId = AL.GenreId";
var res = connection.Query<Album, Genre, Artist, Album>(query, (album, genre, artist) => { album.Genre = genre; album.Artist = artist; return album; }, commandType: CommandType.Text, splitOn: "GenreId, ArtistId");
今、GenreIdとArtistIdにsplitOnを使用しています。それでも同じエラーが発生します。助けてください。
選択クエリに分割する列を含める必要があります。あなたのものは他のすべてのプロパティを選択するだけです-Dapper
はオブジェクトを分割するための一致する列を見つけません。
クエリはおそらく次のようになります。
var query = @"SELECT AlbumId, Title, Price, AlbumArtUrl, GenreId, Name, Description , ArtistId, Name ......" etc
サムは、マルチマッピングとsplitOnオプションに対する優れた答えを書きました。 https://stackoverflow.com/a/7478958/102832
編集:クエリが上記のとおりである場合、GenreIdとArtistIdで分割する必要があります。
AlbumId, Title, Price, AlbumArtUrl | GenreId, Name, Description | ArtistId, Name
パイプは、マップしようとしている新しいPOCOの開始用です。したがって、SplitOn
パラメーターは、GenreIdとArtistIdになります。
編集2:問題はPOCO Album
です。プロパティとしてArtistId
とGenreId
を指定しますが、基本的にそれぞれのPOCO's
。
public class Album
{
public virtual int AlbumId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
そして
var sql = @"SELECT AL.AlbumId
, AL.Title
, AL.Price
, AL.AlbumArtUrl
, GE.GenreId
, GE.Name
, GE.Description
, AR.ArtistId
, AR.Name
FROM Album AL
INNER JOIN Artist AR ON AR.ArtistId = AL.ArtistId
INNER JOIN Genre GE ON GE.GenreId = AL.GenreId";
using (var conn = connFactory.OpenConnection())
{
var res = conn.Query<Album, Genre, Artist, Album>(sql, (album, genre, artist) =>
{
album.Genre = genre;
album.Artist = artist;
return album;
}, splitOn: "GenreId,ArtistId");
}
トリックを行う必要があります。とにかくGenreId
とArtistId
は必要ありません。これらのオブジェクトへの参照はAlbums
にあるからです。