2017-09-06 2 views
0

Ich habe Probleme mit Dapper, wenn ich mein Objekt aus der Datenbank zuordnen möchte.Dapper receive Liste als Objektparameter von JOIN Query

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

Es enthält eine Liste, damit ich getrennt Tabelle erstellt haben, die es hält, wie die

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

Und aus diesen Tabellen I richtigen Set-Objekt mit minimaler Code Aufwand abrufen möchten. Ich habe versucht, beitreten sie und stark geben Sie das Ergebnis Set, aber ohne Erfolg.

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

Ich bin mir bewusst, dass ich einfach Set aus der Tabelle abrufen konnte und dann die GeneratorsList aus separater Abfrage hinzufügen, aber ich bin für eine bessere Lösung.

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

Gibt es eine Lösung, die nur eine Abfrage erfordert?

+1

Verwenden 'QueryMultiple' https: // Stackoverflow. com/questions/6751052/how-to-map-multiple-records-von-einem-single-sp-mit-dapper-dot-net – Ric

Antwort

1

die Abfrage verwenden Sie vorausgesetzt, Sie erhalten kann:

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

Und verwenden linqGroupBy zu konstruieren, um die Set Objekt (-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)});