2013-06-18 8 views
16
を使用している場合

私はアルバムのリストと関連するアーティストを返すために、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"); 

。私はまだ同じエラーが発生します。助けてください。

答えて

28

あなたは、あなたの選択クエリでの分割したいと思い列を含める必要があります。あなたは他のすべてのプロパティを選択するだけです。したがって、Dapperはオブジェクトを分割するのに一致する列を見つけられません。

あなたのクエリは、おそらくそのようなものでなければなりません: https://stackoverflow.com/a/7478958/1028323

編集:

var query = @"SELECT AlbumId, Title, Price, AlbumArtUrl, GenreId, Name, Description , ArtistId, Name ......" etc 

サムは、マルチマッピングとsplitOnオプションの優れた答えを書いたあなたは、前述したように、あなたのクエリがある場合GenreIdとArtistIdに分割しなければなりません。

AlbumId, Title, Price, AlbumArtUrl | GenreId, Name, Description | ArtistId, Name 

パイプは、マップしようとしている新しいPOCOの開始用です。したがって、SplitOnのパラメータはGenreIdとArtistIdになります。

EDIT2:問題はあなたのPOCO Albumです。プロパティとしてArtistIdGenreIdを指定しますが、基本的にそれぞれ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"); 
      } 

トリックを行う必要があります。これらのオブジェクトへの参照がAlbumsにあるため、とにかくGenreIdArtistIdは必要ありません。

+0

あなたから提案された変更を行った後、それでも動作しませんでした。アーティストとアルバムクラスだけを考慮してクエリを変更しました。クエリは= "アーティスト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

+0

@ user2497013私の編集を参照してください。最も簡単な方法は、正しい順序で一致しようとしているPOCOに一致するようにSQLを作成することです。現在、ArtistIdを分割しています。これは、Dapperに、ArtistIdの後にあるすべてのプロパティを正しくない1つのPOCOにマップするように指示します。 – Alex

+0

私はクエリを変更しましたが、まだ動作しません。 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

-2

いくつかのシーンを「アルバム」と「ジャンル」、すべてのそれの名前が同じである性質を持っています。 SO ... Click here can help you.

関連する問題