2016-07-31 119 views
1

複雜的Json我有兩個表:創建使用實體框架C#asp.net

產品

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" 
    } 
] 

所以我想獲得所有圖像o f使用實體框架的每個產品。我試着使用聯接:

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; } 
} 
+0

您可以請您發佈您的'產品'和'圖像'的模型定義,以及您如何建模這兩個實體之間的關係?因爲如果這樣做是正確的,那麼,你不必執行連接,而只需要簡單地獲取'Product',然後序列化(可能使用'Json.NET')。 –

+0

已更新,請看看 –

+0

你可能想要做一個羣組加入 – Rahul

回答

1

您可以明確地建模Product之間的one-to-many關係,Image如下所示:

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); 

OR

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

OR

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

,得到產物和簡單序列化如下:

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

相關序列的那些期間將b加載的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" 
     } 
    ] 
} 

我覺得太成爲你的目的。

希望它有幫助。

+0

它給我一個錯誤'ObjectContext實例已經被處置,不能再被用於需要連接的操作。這件事情,如果我設置this.Configuration.LazyLoadingEnabled = false; –

+0

@IgorLevashov我認爲你試圖在處理'DbContext'實例後序列化。嘗試在此之前序列化。我還更新了我的答案,並附上了一些可能對您有所幫助的額外提示。 –