2017-09-06 1 views
0

J'ai des problèmes pour utiliser Dapper lorsque je souhaite mapper mon objet de la base de données.Dapper receive Liste en tant que paramètre d'objet de la requête JOIN

class Set 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public List<Guid> GeneratorsList { get; set; } 
} 

Il contient une liste donc j'ai créé la table séparée qui le tient, comme ça

CREATE TABLE [dbo].[Sets] (
    [Id]   UNIQUEIDENTIFIER NOT NULL, 
    [Name]  VARCHAR (60)  NOT NULL, 
    [Description] VARCHAR (60)  NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

CREATE TABLE [dbo].[Set_Generator] (
    [SetId]  UNIQUEIDENTIFIER NOT NULL, 
    [GeneratorId] UNIQUEIDENTIFIER NOT NULL, 
    PRIMARY KEY CLUSTERED ([SetId] ASC, [GeneratorId] ASC), 
    FOREIGN KEY ([SetId]) REFERENCES [dbo].[Sets] ([Id]) ON DELETE CASCADE 
); 

Et à partir de ces tableaux que je veux récupérer correctement configuré objet avec un effort de code minimum. J'ai essayé de faire la jointure sur eux et tapez fort le résultat à Set, mais sans succès.

var result = conn.Query<Set>(@"SELECT [S].[Id], [S].[Name], [S].[Description], [SG].[GeneratorId] AS [GeneratorsList] FROM [Sets] AS [S] INNER JOIN [Set_Generator] AS [SG] ON [S].[Id] = [SG].[SetId];"); 

Je suis conscient que je pourrais simplement récupérer Set de table, puis ajoutez la GeneratorsList de requête distincte, mais je suis à la recherche d'une meilleure solution.

var sets = conn.Query<Set>(@"SELECT * FROM [Sets];"); 
foreach(var set in sets) 
{ 
    var generators = conn.Query<Guid>(@"SELECT [GeneratorId] FROM [Set_Generator] WHERE [SetId][email protected]", new { SetId = set.Id }); 
    set.GeneratorsList = generators.ToList(); 
} 

Existe-t-il une solution qui ne nécessite qu'une seule requête?

+1

Utiliser 'QueryMultiple' https: // stackoverflow. com/questions/6751052/how-to-map-multiple-enregistrements-à partir d'un single-sp-with-dapper-dot-net – Ric

Répondre

1

Utilisation de la requête que vous avez fourni, vous pouvez recevoir:

internal class GeneratorSet 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public Guid GeneratorId { get; set; } 
} 

Et utiliser linqGroupBy pour construire l'objet Set (-s):

var generatorSets = conn.Query<GeneratorSet>(@"SELECT [S].[Id], [S].[Name], [S].[Description], [SG].[GeneratorId] AS [GeneratorsList] FROM [Sets] AS [S] INNER JOIN [Set_Generator] AS [SG] ON [S].[Id] = [SG].[SetId];");; 

var res = generatorSets.GroupBy(gen => gen.Id, p => p, (key, g) => new Set() 
     { Id = key, Generators = g.Select(g => g.GeneratorId)});