Cartographie intermédiaire Dapper

c# dapper orm sql-server

Question

Cartographie légèrement plus avancée que dans ma question précédente :)

Les tables:

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)
)

Des classes:

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

Est-il possible d'utiliser un select pour les remplir tous? Quelque chose comme ça:

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

Et alors:

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

Edit1 - Je pourrais le faire avec deux boucles imbriquées (foreach secondaires -> pour les tertiaires) et effectuer une requête pour chaque élément, mais me demander si cela pourrait être fait avec un seul appel à la base de données.

Edit2 - Peut-être que la méthode QueryMultiple serait appropriée ici, mais si je comprends bien, il me faudrait plusieurs instructions select. Dans mon exemple réel, la sélection a plus de 20 conditions (dans la clause where), où le paramètre de recherche pourrait être nul, donc je ne voudrais pas répéter tous ceux où les instructions de toutes les requêtes ...

Réponse acceptée

Dapper prend en charge le mappage multiple, pour la documentation, voir: http://code.google.com/p/dapper-dot-net/

Voici l'un des exemples d'un des projets sur lesquels je travaille actuellement:

        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();

L'astuce consiste à utiliser l'option splitOn pour diviser le jeu d'enregistrements en plusieurs objets.

Vous pouvez également vérifier ma question pour voir la structure de classe pour l'exemple ci-dessus: Problème de Dapper Multi-mapping


Réponse populaire

Qu'en est-il de la création d'une commande SQLC, puis d'un groupe d'objets SQLParameter. Idéalement avec un proc stocké mais pas nécessairement.

Chacun de ces paramètres de sortie pourrait alors être redirigé vers vos classes.

Cet autre article sur Stack contient du code qui pourrait être pertinent.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi