Dapper 从 JOIN 查询中接收列表作为对象参数
Dapper receive List as object parameter from JOIN query
当我想从数据库映射我的对象时,我在使用 Dapper
时遇到了问题。
class Set
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Guid> GeneratorsList { get; set; }
}
它包含一个列表,所以我创建了单独的 table 来保存它,就像那样
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
);
我想从那些 table 中检索正确的 Set 对象,代码工作量最少。我尝试加入它们并将结果强类型输入 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];");
我知道我可以简单地从 table 中检索 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();
}
是否有只需要一次查询的解决方案?
使用您提供的查询,您可能会收到:
internal class GeneratorSet
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid GeneratorId { get; set; }
}
并使用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)});
当我想从数据库映射我的对象时,我在使用 Dapper
时遇到了问题。
class Set
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Guid> GeneratorsList { get; set; }
}
它包含一个列表,所以我创建了单独的 table 来保存它,就像那样
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
);
我想从那些 table 中检索正确的 Set 对象,代码工作量最少。我尝试加入它们并将结果强类型输入 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];");
我知道我可以简单地从 table 中检索 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();
}
是否有只需要一次查询的解决方案?
使用您提供的查询,您可能会收到:
internal class GeneratorSet
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid GeneratorId { get; set; }
}
并使用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)});