如何获取查询的SQL结果映射到嵌套模型

问题描述 投票:0回答:1

我有一个 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 结果以映射到模型,以便它可以将结果放入域 -> 子域的嵌套列表中。

c# sql .net model
1个回答
0
投票

根据您的对象模型,您想要的 (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;
© www.soinside.com 2019 - 2024. All rights reserved.