我有两个表:
产品
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"
}
]
因此,我想使用实体框架获取每个产品的所有图像。我尝试使用连接:
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();
还有我的杰森
[
{
"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; }
}
您可以显式地对和one-to-many
之间的关系进行建模Product
,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);
或者
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
相关联的那些被标记虚拟将序列化期间b加载。您不需要执行和显式联接。这里的关键是您需要在处置DbContext
实例之前进行序列化,否则延迟加载功能可能无法正常工作,并且可能会遇到一些意外错误。
您还可以另外将该Product
属性标记Image
为,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"
}
]
}
我认为这也符合您的目的。
希望能帮助到你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句