Dapper SplitOn 重复 类

Dapper SplitOn Repeating Classes

我担心我可能误解了 Dapper 中的多重映射。

鉴于以下情况:

public class Job
{
    public int JobId { get; set; }
    public Site FromSite { get; set; }
    public Site ToSite { get; set; }
}

public class Site
{

    public int SiteId { get; set; }
    public string CompanyName { get; set; }
    public Address Address { get; set; }
}
public class Address
{
    public string Address1 { get; set; }
    public string Postcode { get; set; }
}

每个作业将有 2 个 Site 实例,每个实例将有一个 Address

实例

这是扁平化的,我正在尝试将其映射如下:

    string sql = @"
                    select 
                        JOBIdNumber JobId, 

                        fr.SUPKey SiteId, 
                        fr.SUPCompanyName CompanyName, 

                        fr.SUPAddress1 Address1, 
                        fr.SUPPostCode Postcode, 

                        t.SUPKey SiteId, 
                        t.SUPCompanyName CompanyName, 

                        t.SUPAddress1 Address1, 
                        t.SUPPostCode PostCode

                    FROM tb_JobJob inner Join tb_SUPSupplier fr on JOBFromSiteId = fr.SupKey
                    inner join tb_SUPSupplier t on t.SUpkey = jobTositeId
                    where jobidnumber = @JobId
                ";

    var jb = cn.Query<Job, Site, Address, Site, Address, Job>(sql,
        (job, fromSite, fromSiteAddress, toSite, toSiteAddress) =>
    {
        job.FromSite = fromSite;
        job.FromSite.Address = fromSiteAddress;

        job.ToSite = toSite;
        job.ToSite.Address = toSiteAddress;

        return job;
    },
    splitOn: "SiteId,Address1",
    param: new { JobId = jobId });

这导致:

When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id

我不确定我是否误解了这个过程,如果是,我该如何映射这个,看起来应该是其他人遇到过的。

您没有提供足够的信息来将结果列拆分为相应的 objects。

    string sql = @"
                    select 
                        1 as JobId, 
                        2 as SiteId, 
                        'Company 1' as CompanyName, 
                        'Address 1' as Address1, 
                        'Postcode 1' as Postcode, 
                        3 as SiteId, 
                        'Company 2' as CompanyName, 
                        'Address 2' as Address1, 
                        'Postcode 2' as PostCode
                ";

   var jb = connection.Query<Job, Site, Address, Site, Address, Job>(sql,
                    (job, fromSite, fromSiteAddress, toSite, toSiteAddress) =>
                    {
                        job.FromSite = fromSite;
                        job.FromSite.Address = fromSiteAddress;

                        job.ToSite = toSite;
                        job.ToSite.Address = toSiteAddress;

                        return job;
                    },
                    splitOn: "JobId,SiteId,Address1,SiteId,Address1");

做这份工作。

splitOn的意思是“把所有的东西都UP,包括split字段放到各自的object中。因为你有多个child类,你需要定义一个split他们每个人的领域。