温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - Populate object from dataset when having list in list C#

sql - 在列表C#中具有列表时,从数据集中填充对象

发布于 2020-03-31 23:16:19

我可以从数据库中获得以下数据:

|----------------|--------------|----------------|----------------|----------------|----------------|
|  entity_name   |  provider_id | provider_name  |  product_id    | product_name   | country_name   |    
|----------------|--------------|----------------|----------------|----------------|----------------|
|     test       |     123      |  Provider1     |         1      |  Product1      |    Russia      | 
|----------------|--------------|----------------|----------------|----------------|----------------| 
|     test       |     123      |  Provider1     |         2      |  Product2      |    Spain       | 
|----------------|--------------|----------------|----------------|----------------|----------------|
|     test       |     123      |  Provider1     |         3      |  Product3      |    France      | 
|----------------|--------------|----------------|----------------|----------------|----------------|
|     test       |     456      |  Provider2     |         3      |  Product3      |    France      | 
|----------------|--------------|----------------|----------------|----------------|----------------|
|     test       |     123      |  Provider1     |         4      |  Product4      |    France      |     

而且我必须将其映射到C#中的此模型:

public class EntityModel 
{
   public string EntityName { get; set; }
   public List<ProviderModel> Providers { get; set; }
}

public class ProviderModel
{
   public int ProviderID { get; set; }
   public string ProviderName { get; set; }
   public List<ProductModel> Products { get; set; }
   public ProviderModel() { }
}

public class ProductModel
{
  public int ProductID { get; set; }
  public string ProductName { get; set; }
  public string CountryName { get; set; }
  public ProductModel() { }
}

因此,基本上,我必须按提供商分组,对于每个提供商,我都必须展示产品:

{
   "entityName": "string",
   "providers": [
    {
     "ProviderID": 0,
     "ProviderName": "string",
     "products": [
       {
        "productId": 0,
        "productName": "string",
        "countryName": "string"
       }
     ]
    }
  ]
}

返回数据的sp像这样:

SELECT DISTINCT 
e.entity_name 
,pro.provider_id
,pro.provider_name
,p.product_id
,p.product_name
,pc.country_name
FROM provider_product_table ppt
INNER JOIN product p ON ppt.product_id = p.product_id
INNER JOIN product_parent pp on pp.product_parent_id=p.product_parent_id
INNER JOIN provider pro ON pro.provider_id = ppt.provider_id
INNER JOIN product_country pc on pc.product_id=p.product_id
INNER JOIN entity e on e.product_parent_id=pp.product_parent_id
WHERE p.product_parent_id = @product_parent_id
ORDER BY p.product_id ASC   

我尝试了很多groupBy版本,但是在映射第二个列表(产品之一)时遇到了麻烦。我该如何实现?谢谢 !

查看更多

提问者
Frey_ja
被浏览
9
MoxGeek 2020-01-31 19:41

让我们首先说您的数据库不是结构良好或没有根据您的需要创建的,如果您尝试通过实体和提供者之间的关系将数据分成三个表(实体,提供者,产品),那将是不小的好处。供应商与产品表之间的关系。

但是,也许您正在开发一项新功能,但它起初并未考虑使代码甚至数据库具有更高的可扩展性。在这种情况下,我需要查看您已经创建的组查询请求(groupby)。

同时我可以想象您的需求,所以您有几种解决方案。

第一个是您要做什么,创建几个查询来填充您的类,我也可以想象冗余,因为由于数据库结构的缘故,有些ID不幸地被复制了,在这种情况下,您需要使用DISTINCTINTERSECT(即使这里不是您的需要)。

秒,INTO#tmpTable如果您使用的是sqlserver,则可以使用关键字处理临时表,因此基本上是在内存中创建一个新表来执行查询(这些表是我上面建议的)。

尝试使用您描述的查询来编辑您的问题。

发布
问题

分享
好友

手机
浏览

扫码手机浏览