9

私の前の質問よりも少し高度なマッピング:)

テーブル:

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; }
}

それらすべてを埋めるために1つの選択を使用することは可能ですか? このようなもの:

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 2 次 -> foreach 3 次) で実行でき、各項目に対してクエリを実行できますが、単一のデータベース呼び出しで実行できるかどうか疑問に思います。

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

4

3 に答える 3

4

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

これは、私が現在取り組んでいるプロジェクトの 1 つからの例の 1 つです。

        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

于 2012-06-22T14:14:44.400 に答える
1

すべての ORM で、いくつかのクエリがあるようです。おそらく Dapper や Petapoco に基づいて、独自のソリューションを作成することしかできません。たとえば、すべてのクエリを 1 つの SQL バッチに結合します。

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

次に、DataReader.NextResult() を使用して、1 つのレコードセットから nex に移動できます。

次に、メモリ内のデータを組み合わせてオブジェクト構造を完成させる必要があります。

于 2012-05-18T04:37:17.383 に答える
1

SQLCommand を作成してから、一連の SQLParameter オブジェクトを作成するのはどうですか。理想的にはストアド プロシージャを使用しますが、そうである必要はありません。

これらの各出力パラメーターは、クラスにマップし直すことができます。

スタックに関するこの他の投稿には、関連する可能性のあるコードがいくつかあります。

于 2012-06-22T07:23:46.290 に答える