【问题标题】:ASP.net JSON Rest API Output from Complex Class from Database来自数据库的复杂类的 ASP.net JSON Rest API 输出
【发布时间】:2016-10-12 15:01:17
【问题描述】:

数据库表

tbl_Product
 - id (pk)
 - name
 - price
tbl_image
 - id (pk)
 - prd_id (fk)
 - imageUrl 

我想像这样从我的数据库中得到 Json 结果

[
   {
      "id":"",
      "name":"",
      "price":"",
      "images":[
         {
            "id":"",
            "imageUrl":""
         },
         {
            "id":"",
            "imageUrl":""
         },
         {
            "id":"",
            "imageUrl":""
         }
      ]
   },
   {
      "id":"",
      "name":"",
      "price":"",
      "images":[
         {
            "id":"",
            "imageUrl":""
         },
         {
            "id":"",
            "imageUrl":""
         }
      ]
   }
]

C# 对象类

class ProductModel
{
   public int id {get; set;}
   public string name {get; set;}
   public string price {get; set;}
   public ImageModel images {get; set;}
}

class ImageModel
{
   public int id {get; set;}
   public int prd_id {get; set;}
   public string imageUrl {get; set;}
}

首先感谢您阅读我的简单问题。

如何获得像上面这样的 json 输出.. 如果我加入查询以获得这样的输出,我会感到困惑..

 select *  from tbl_Product a inner join tbl_images b on a.id = b.prd_id

这将导致连接两个表,我如何将其从业务逻辑中分离出来以生成该输出..

我们是否需要从 tbl_Product 表中获取所有产品并执行 for 循环,同时将数据表映射到对象获取 imageByProductId 并添加到该 ProductModel 对象..

我不确定这是不是最快的方式..我不想使用实体框架... 我只想要一种方法,它为我提供上述格式的 JSON,并尝试确保该方法在 C# 中没有任何框架

感谢您阅读我的问题并等待您的答复。

【问题讨论】:

  • images 是复数,让我考虑一个集合而不是单个实例。你能澄清一下吗?
  • 基本上我想像上面那样生成数据输出。我有两个表产品表依赖于图像表。所以请建议我一种对数据库的查询的方式并生成这样的输出..
  • 您提到您不想使用 EF。那么你使用什么技术来喂养模型呢?

标签: c# asp.net sql-server rest asp.net-web-api


【解决方案1】:

如果您使用的是 Azure SQL 数据库,或者您可以安装 SQL Server 2016,那么您可以添加 FOR JSON AUTO 子句:

select *  from tbl_Product a inner join tbl_images b on a.id = b.prd_id
FOR JSON AUTO

这将返回 JSON 文本,您可以简单地将其作为 API 响应返回。

【讨论】:

    【解决方案2】:

    首先你的模型需要是这样的

        class ProductModel
        {
           public int id {get; set;}
           public string name {get; set;}
           public string price {get; set;}
           public IList<ImageModel> images {get; set;}
        }
    
        class ImageModel
        {
           public int id {get; set;}
           public string imageUrl {get; set;}
        }
    

    然后尝试下面的 linq to sql 查询

        tbl_Product.Select(prod => 
             new ProductModel
                { 
                       id = prod.id,
                       name = prod.name,
                       price = prod.price,
                       images = prod.tbl_image.Select(img => new ImageModel
                                               {
                                                  id = img.id,
                                                  imageUrl = img.imageUrl
                                                })
    
                }).ToList()
    

    【讨论】:

    • 仅供参考:Vladimir 在那里使用 LINQ to SQL,因此请确保您知道如何使用它。
    • @Vladimir 谢谢,但我使用 linq 的经验非常少。而且我希望解决方案的性能更好,因为我的产品表包含 1M+ 记录..
    • 顺便说一句,我尝试了一件快速的事情.. 从产品中获取所有数据并从存储在列表对象中的图像中获取所有数据并在图像列表中迭代并找到匹配的记录,如果为真,则将该记录推送到产品列表...给出相同的结果,但不确定这是否是正确和最快的方法..
    • @MayankJhawar 从性能的角度来看,这个 linq 查询非常快,最终它只向数据库发送一个 sql 并接收由于一个对数据库的请求而产生的所有数据,所以如果你这样做,则不需要额外连接到数据库不想钻 linq 人员和创建 Context、模型等,可以使用 ADO.net
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2018-05-14
    • 2021-08-15
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多