C# 使用Dapper SplitOn时如何映射对象?

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

我有一个存储的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; }
    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
进行分组,以便投影出
内容
子项