首页 > 解决方案 > 在列表 C# 中有列表时从数据集中填充对象

问题描述

我从数据库中获得了这些数据:

|----------------|--------------|----------------|----------------|----------------|----------------|
|  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 版本,但我被困在映射第二个列表,即产品一个。我怎样才能做到这一点?谢谢 !

标签: c#sql

解决方案


让我们首先说您的数据库不是结构良好或不是根据您的需要创建的,如果您尝试将数据分成三个表(实体,提供者,产品),实体和提供者之间有关系,那就太好了,并且您的提供者和产品表之间的关系。

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

同时我可以想象你的需要,所以你有几个解决方案。

第一个是你想要做什么,创建几个填充你的类的查询,我也可以用冗余来想象,因为有一些 id 由于你的数据库结构而不幸重复,在这种情况下你需要使用DISTINCTINTERSECT(即使它不是你需要的)。

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

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


推荐阅读