私はアルバムのリストと関連するアーティストを返すために、Dapperののマルチマッピング機能を使用しようとしているとジャンル。APIを使用すると、ID以外のキーを持っている場合は、splitOnのPARAMを設定し確実に多マッピング「」splitOn
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')
あなたによって示唆されているように私は、クエリを変更:今、私はGenreIdとARTISTIDためsplitOnを使用しています
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");
。私はまだ同じエラーが発生します。助けてください。
あなたから提案された変更を行った後、それでも動作しませんでした。アーティストとアルバムクラスだけを考慮してクエリを変更しました。クエリは= "アーティストAR INNER FROM SELECT AR.ArtistId、AR.Name、AL.AlbumId、AL.Price、AL.Title、AL.AlbumArtUrlはAR.ArtistId = AL.AlbumIdでアルバムALをJOIN"; (アーティスト、アーティスト)=> {album.Artist = artist; return album;}、commandType:CommandType.Text、splitOn: "ArtistId"); var item = connection.Query <アルバム、アーティスト、アルバム>それでも動作しませんでした – user2497013
@ user2497013私の編集を参照してください。最も簡単な方法は、正しい順序で一致しようとしているPOCOに一致するようにSQLを作成することです。現在、ArtistIdを分割しています。これは、Dapperに、ArtistIdの後にあるすべてのプロパティを正しくない1つのPOCOにマップするように指示します。 – Alex
私はクエリを変更しましたが、まだ動作しません。 ALTERNAME JOINアーティストAR ON AR AR ALARNER JOINアーティスト:AR ARNアーティスト:AR ARNアーティスト:AR ARNアーティスト:AR INN ARこのアーティストの最新リリース情報を受信する.ArtistId = AL.ArtistId INNER JOINジャンルGE ON GE.GenreId = AL.GenreId "; var res = connection.Query <アルバム、ジャンル、アーティスト、アルバム>(クエリ、(アルバム、ジャンル、アーティスト)=> {album.Genre =ジャンル; album.Artist =アーティスト;アルバムを返す;}、commandType:CommandType .Text、splitOn: "GenreId、ArtistId");助けてください。 – user2497013