2012-04-19 30 views
9

もう少し高度なマッピングは、その後、私のprevious question :)Dapperの中間マッピング

表:

create table [Primary] (
    Id int not null, 
    CustomerId int not null, 
    CustomerName varchar(60) not null, 
    Date datetime default getdate(), 
    constraint PK_Primary primary key (Id) 
) 

create table Secondary(
    PrimaryId int not null, 
    Id int not null, 
    Date datetime default getdate(), 
    constraint PK_Secondary primary key (PrimaryId, Id), 
    constraint FK_Secondary_Primary foreign key (PrimaryId) references [Primary] (Id) 
) 

create table Tertiary(
    PrimaryId int not null, 
    SecondaryId int not null, 
    Id int not null, 
    Date datetime default getdate(), 
    constraint PK_Tertiary primary key (PrimaryId, SecondaryId, Id), 
    constraint FK_Tertiary_Secondary foreign key (PrimaryId, SecondaryId) references Secondary (PrimaryId, Id) 
) 

クラス:

public class Primary 
{ 
    public int Id { get; set; } 
    public Customer Customer { get; set; } 
    public DateTime Date { get; set; } 
    public List<Secondary> Secondaries { get; set; } 
} 

public class Secondary 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public List<Tertiary> Tertiarys { get; set; } 
} 

public class Tertiary 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

それはそれらすべてを埋めるために選択いずれかを使用することは可能ですか?

const string sqlStatement = @" 
    select 
     p.Id, p.CustomerId, p.CustomerName, p.Date, 
     s.Id, s.Date, 
     t.Id, t.Date 
    from 
     [Primary] p left join Secondary s on (p.Id = s.PrimaryId) 
     left join Tertiary t on (s.PrimaryId = t.PrimaryId and s.Id = t.SecondaryId) 
    order by 
     p.Id, s.Id, t.Id 
"; 

そして:このような何か

IEnumerable<Primary> primaries = connection.Query<Primary, Customer, Secondary, Tertiary, Primary>(
    sqlStatement, 
    ... here comes dragons ... 
    ); 

EDIT1 - 私は2つのネストされたループ(foreachののセカンダリ - > foreachのtertiaries)でそれを行うことができ、各項目のクエリを実行し、ちょうど疑問に思います単一のデータベース呼び出しで実行できるかどうか。

Edit2 - ここではQueryMultipleメソッドが適切かもしれませんが、正しく理解すれば複数のselect文が必要です。私の実際の人生の例では、selectには20個以上の条件があります(where句では、検索パラメータがnullになる可能性があるため、すべてのクエリのステートメントを繰り返してはいけません)...

答えて

4

Dapperのは、ドキュメントを参照してください、マルチマッピングをサポートしています。ここではhttp://code.google.com/p/dapper-dot-net/

は、私が現在働いているプロジェクトの一つから、例の一つである:

 var accounts2 = DbConnection.Query<Account, Branch, Application, Account>(
        "select Accounts.*, SplitAccount = '', Branches.*, SplitBranch = '', Applications.*" + 
        " from Accounts" + 
        " join Branches" + 
        "  on Accounts.BranchId = Branches.BranchId" + 
        " join Applications" + 
        "  on Accounts.ApplicationId = Applications.ApplicationId" + 
        " where Accounts.AccountId <> 0", 
        (account, branch, application) => 
        { 
         account.Branch = branch; 
         account.Application = application; 
         return account; 
        }, splitOn: "SplitAccount, SplitBranch" 
        ).AsQueryable(); 

トリックがsplitOnを使用することですオプションを使用して、レコードセットを複数のオブジェクトに分割します。

私の質問をチェックして、上記の例のクラス構造を確認することもできます。Dapper Multi-mapping Issue

1

すべてのORMには複数のクエリがあります。おそらく、DapperやPetapocoに基づいて独自のソリューションを作成することしかできません。例えば、1つのSQLバッチ内のすべてのクエリを組み合わせる:

select * from Primary where ... 
select * from Secondary where ... 
select * from Tertiary where ... 

次にあなたがDataReader.NextResultを(使用してNEXに1つのレコードから移動することができます)

を次に、オブジェクトの構造を完了するために、メモリ内のデータを結合する必要があります。

1

SQLCommandを作成し、次にSQLParameterオブジェクトを作成することはどうでしょうか。理想的には格納されたprocであるが、必ずしもそうである必要はない。

これらの出力パラメータはそれぞれ、クラスにマッピングされて戻されます。

This other post(スタック)には、関連性のあるコードがいくつかあります。

関連する問題