C# 使用Dapper SplitOn时如何映射对象?
我有一个存储的proc,它返回多个包含以下列的行:C# 使用Dapper SplitOn时如何映射对象?,c#,dapper,C#,Dapper,我有一个存储的proc,它返回多个包含以下列的行: Guid, Guid, Name, Guid, Description 所有行的第一列Guid始终相同。因此,我创建了以下类: public class Header { public Guid Guid { get; set; } public string Name { get; set; } } public class Content { public Guid Guid { get; set; }
Guid,
Guid,
Name,
Guid,
Description
所有行的第一列Guid
始终相同。因此,我创建了以下类:
public class Header
{
public Guid Guid { get; set; }
public string Name { get; set; }
}
public class Content
{
public Guid Guid { get; set; }
public string Description { get; set; }
}
public class Result
{
public Guid Guid { get; set; }
public IEnumerable<Header> Headers { get; set; }
public IEnumerable<Content> Content { get; set; }
}
公共类标题
{
公共Guid Guid{get;set;}
公共字符串名称{get;set;}
}
公开课内容
{
公共Guid Guid{get;set;}
公共字符串说明{get;set;}
}
公开课成绩
{
公共Guid Guid{get;set;}
公共IEnumerable头{get;set;}
公共IEnumerable内容{get;set;}
}
为了得到我想做的事情:
var result connection.Query<Guid, Header, Content>("myproc",
new { criteria },
commandType: CommandType.StoredProcedure,
map: ,
splitOn: "Guid").AsList();
var result connection.Query(“myproc”,
新的{标准},
commandType:commandType.StoredProcess,
地图:,
splitOn:“Guid”).AsList();
但是在
map
参数中我应该怎么做才能将结果分割成对象呢?我不认为您可以调用返回的5列中的3列,并使用相同的名称(Guid
)期望Dapper找出如何正确分割
假设存储过程返回的列名是唯一的(我命名为Guid1
、Guid2
和Guid3
),我们在Guid2
(标题)和Guid2
(内容)上进行拆分
由于查询将从Proc返回的每行返回一行,因此我们需要按父Guid合并和分组
我已使用进行此汇总:
var sql = "EXEC p_myProc";
var resultDictionary = new Dictionary<Guid, Result>();
var results = connection.Query<Result, Header, Content, Result>(
sql,
(result, header, content) =>
{
if (!resultDictionary.TryGetValue(result.Guid1, out var existingResult))
{
result.Headers = new List<Header>();
result.Content = new List<Content>();
resultDictionary.Add(result.Guid1, result);
existingResult = result;
}
// Noting OP has defined the Child tables as immutable IEnumerable<>
(existingResult.Headers as List<Header>).Add(header);
(existingResult.Content as List<Content>).Add(content);
return existingResult;
},
splitOn: "Guid2,Guid3")
.Distinct() // Strip duplicates by reference equality
.ToList();
var sql=“EXEC p_myProc”;
var resultDictionary=新字典();
var results=connection.Query(
sql,
(结果、标题、内容)=>
{
if(!resultDictionary.TryGetValue(result.Guid1,out var existingResult))
{
result.Headers=新列表();
result.Content=新列表();
resultDictionary.Add(result.Guid1,result);
现有结果=结果;
}
//注意,OP已将子表定义为不可变IEnumerable
(existingResult.Headers作为列表)。添加(header);
(existingResult.Content作为列表)。添加(Content);
返回现有结果;
},
拆分:“Guid2,Guid3”)
.Distinct()//按引用相等剥离重复项
.ToList();
请注意,Query
返回的结果的行数与proc返回的行数相同,但因为我们将为每个Guid1
键返回相同的引用Result
,Distinct()
将去掉重复项
这种方法的一种替代方法是将存储过程的展平结果映射到所有5列的1:1临时DTO POCO中,然后使用内存中的LINQ按Guid1
进行分组,以便投影出头
和内容
子项