使用实体框架C#asp.net创建复杂的Json

本文关键字:创建 复杂 Json net C#asp 实体 框架 | 更新日期: 2023-09-27 17:59:27

我有两个表:

产品

ProductId | ProductName
__________|____________
       1  | iPhone5
       2  | iPhone6
       3  | iPhone6s

图像

Id |    ImagePath     | ProductId
___|__________________|___________
1  | /images/231.jpg  |    2
2  | /images/432.jpg  |    2
3  | /images/111.jpg  |    1 

我想让Json看起来像

{  
   "id":"2",
   "ProductName":"iPhone6"
},
"Images":[  
   {  
      "Id":"1",
      "ImagePath":"/images/231.jpg"
   },
   {  
      "Id":"2",
      "ImagePath":"/images/432.jpg"
   }
]

所以我想使用实体框架获得每个产品的所有图像。我尝试使用join:

 var ads = db.Products.
      Join(db.Images, 
           x=>x.ProductId,
           cm=>cm.ProductId,
           (x ,cm) => new {
            Ads = x, 
            Images = cm
      }).
      Select(d => new {
            d.Ads.AdId,
            d.Images.ImagePath,
       }).
      Where(x => x.ProductId== 2).
      ToList();

还有我的Json

[
    {
        "AdId":2,
        "ImagePath":"/images/231.jpg"
    },
    {
        "AdId":2,
        "ImagePath":"/images/432.jpg"
    }
]

我的产品和图像模型:

public class Product{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public virtual ICollection<Image> Images { get; set; }
}
public class Image{
    public int ImageId { get; set; }
    public string ImagePath { get; set; }
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

使用实体框架C#asp.net创建复杂的Json

您可以显式地为ProductImage之间的one-to-many关系建模,如下所示:

public class ProductConfig : EntityTypeConfiguration<Product>
{
    public ProductConfig()
    {
        HasMany(p => p.Images).WithRequired(i => i.Product).HasForeignKey(i => i.ProductId);
    }
}

并在DbContext中添加此配置,如下所示:

public class MyDbContext:DbContext
{
    ...
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ProductConfig());            
    }
}

一旦关系被正确建模,那么你就可以使用:

var prod = myDbContext.Products.Find(2);

var prod = myDbContext.Products.SingleOrDefault(p => p.ProductId == 2);

var prod = myDbContext.Products.Where(p => p.Id == 2);

以获得产品并简单地序列化如下:

var iPhone6Json = JsonConvert.SerializeObject(iPhone6, Formatting.Indented);

关联的Images将在序列化期间加载,因为它们被标记为虚拟。您不需要执行和显式联接。这里的关键是,在处理DbContext实例之前,您需要序列化,否则延迟加载的功能可能无法工作,并且您可能会面临一些不希望出现的错误。

您还可以将Image中的Product属性标记为JsonIgnore,以将其从序列化中排除并避免引用循环。

[JsonIgnore]
public int ProductId { get; set; }
[JsonIgnore]
public Product Product { get; set; }

那么你应该拥有的JSON如下:

{  
    "id":"2",
    "ProductName":"iPhone6",
    "Images":[  
       {  
          "Id":"1",
          "ImagePath":"/images/231.jpg"
       },
       {  
          "Id":"2",
          "ImagePath":"/images/432.jpg"
       }
    ]
}

我认为这也符合你的目的。

希望能有所帮助。