Dapper SplitOn Повторяющиеся классы - PullRequest
1 голос
/ 01 октября 2019

Боюсь, я могу неправильно понимать мульти-картографию в 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 });

Что приводит к:

При использовании API многократного отображения убедитесь, что вы установили параметр splitOn, если у вас естьключи, кроме Id

Я не уверен, неправильно ли я понимаю процесс, и если да, то как мне это отобразить, похоже, что это должно быть что-то, с чем сталкивались другие.

1 Ответ

2 голосов
/ 02 октября 2019

Вы не предоставляете достаточно информации, чтобы разбить столбцы результатов на соответствующие объекты.

    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 означает «положить все вверх и включаяразделить поле на соответствующий объект. Поскольку у вас есть несколько дочерних классов, вам необходимо определить разделенное поле для каждого из них.

...