我有一个 SQL 查询如下:
SELECT d.domain_id, d.name, sd.subdomain_id, sd.name, sd.[description]
FROM [myDB].SubDomains sd INNER JOIN [myDB].Domains d
ON d.domain_id = sd.domain_id ORDER BY d.[name], sd.[name]
这将返回以下结果:
domain_id | name | subdomain_id |name | description
1 A 11 AB AB description
1 A 12 AC AC description
2 B 21 BA BA description
我的C#模型如下:
// This is Domain Mapping as we can have list of domains
public class HigherLevel
{
public List<DomainModel> Domains { get; set; }
}
public class DomainModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<SubDomainModel> SubDomains { get; set; }
}
public class SubDomainModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
我想保持模型与 API 中的模型相同,我需要的响应为:
HigherLevel: {
domains: [{
id:,
name:,
subdomains: [{ id: ,name: , description: }]
},
{ id:,
name:,
subdomains: [{ id: ,name: , description: },
{ id: ,name: , description: }]
},
id:,
name:,
subdomains: [{ id: ,name: , description: }]
},
{ id:,
name:,
subdomains: [{ id: ,name: , description: },
{ id: ,name: , description: }]
}]
}
在更高级别上,可以有多个域,并且域内可以有多个子域。 我想知道如何返回 SQL 结果以映射到模型,以便它可以将结果放入域 -> 子域的嵌套列表中。
根据您的对象模型,您想要的 (json) 结构将是:
HigherLevel: {
domains: [{
id:,
name:,
subdomains: [{ id: ,name: , description: }]
},
{ id:,
name:,
subdomains: [{ id: ,name: , description: },
{ id: ,name: , description: }]
},
id:,
name:,
subdomains: [{ id: ,name: , description: }]
},
{ id:,
name:,
subdomains: [{ id: ,name: , description: },
{ id: ,name: , description: }]
}]
}
接下来,获得相同结果集的 Linq 将是:
var data = (from d in db.Domains
join sd in db.SubDomains on d.DomainId equals sd.DomainId
orderby d.Name, sd.Name
select new
{
Id = d.DomainId,
Name=d.name,
SubdomainID = sd.SubdomainId,
SubDomainName = sd.Name,
Description = sd.Description
}).ToList();
现在,我看不到将数据移动到您想要的结构中的简单方法,所以让我们循环执行。
var domainId = -1;
var higherLevels = new HigherLevel();
higherLevels.Domains = new List<Domain>(); // should be handled in ctor
Domain domain = null;
foreach(var row in data)
{
if (row.DomainId != domainId)
{
domainId = row.DomainId;
domain = new Domain();
domain.SubDomains = new List<SubDomain>(); // again, in ctor
domain.Id = row.Id;
domain.Name = row.Name;
higherLevels.Domains.Add(domain);
}
var sd = new SubDomain();
sd.Id = row.SubDomainId;
sd.Name = row.SubDomainName;
sd.Description = row.Description;
domain.SubDomains.Add(sd);
}
return higherLevels;