简体   繁体   English

Dapper从JOIN查询中接收List作为对象参数

[英]Dapper receive List as object parameter from JOIN query

I have trouble using Dapper when i want to map my object from database. 我想从数据库映射对象时使用Dapper遇到麻烦。

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

It contains a list so I've created separated table that holds it, like that 它包含一个列表,因此我创建了一个单独的表来保存它,像这样

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

And from those tables I want to retrieve correct Set object with minimum code effort. 从这些表中,我想以最少的代码工作量检索正确的Set对象。 I've tried to do join on them and strong type the result to Set , but with no success. 我尝试加入它们并将结果强类型输入Set ,但是没有成功。

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

I'm aware that I could simply retrieve Set from table and then add the GeneratorsList from separate query, but I'm looking for a better solution. 我知道我可以简单地从表中检索Set ,然后从单独的查询中添加GeneratorsList ,但我正在寻找更好的解决方案。

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]=@SetId", new { SetId = set.Id });
    set.GeneratorsList = generators.ToList();
}

Is there a solution that require only one query ? 是否有只需要一个查询的解决方案?

Using the query you provided you may receive: 使用您提供的查询,您可能会收到:

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

And use linq GroupBy to construct the Set object(-s): 并使用linq GroupBy构造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)});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM