通过外键从另一个 table 获取相关数组
Get related array from another table by foreign key
我正在使用 SQL Server 2012、MVC WebAPI、AutoMapper 和 Entity Framework。
在数据库中,我有两个具有一对多关系的表,例如类别和产品;一个类别可以有更多的产品,但一个产品只能有一个类别。我想要的是一个 json,每个类别还包含一个 Products.CategoryId 字段的相关产品数组。
这是我在网上搜索后做出的:
public class CategoriesViewModel
{
public string CategoryName { get; set; }
public IEnumerable<ProductsViewModel> Products { get; set; }
}
public class ProductsViewModel
{
public string Name { get; set; }
}
public static class ViewModelMapper
{
public static TDestination Map<TDestination>(object source)
{
return Mapper.Map<TDestination>(source);
}
public static void RegisterMaps()
{
AutoMapper.Mapper.Initialize(config =>
{
config.CreateMap<Products, ProductsViewModel>().ReverseMap();
config.CreateMap<Categories, CategoriesViewModel>()
.ForMember(dest => dest.Products, opt => opt.MapFrom(src => src.Products))
.ReverseMap();
}
}
}
// Repository
public IEnumerable<CategoriesViewModel> GetCategories()
{
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(Context.Categories);
}
//Business Logic
public IEnumerable<CategoriesViewModel> GetCategories()
{
return Repository.GetCategories();
}
[Route("Categories"), HttpGet]
public IHttpActionResult GetCategories()
{
return Ok(BL.GetCategories());
}
我的结果是一个包含空或空产品数组的类别列表,我找不到解决方案。
我怎样才能达到我的结果?
谢谢
编辑:
Entity Framework 型号
public partial class Category
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Category()
{
this.Products = new HashSet<Product>();
}
public int CategoryId { get; set; }
public string CategoryName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Product> Products { get; set; }
}
public partial class Product
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public string ProductName { get; set; }
public virtual Category Category { get; set; }
}
Category 和 Product 只是示例,如果视图模型 属性 名称不同则忽略。
我怀疑你 Lazy Loading 关闭了。
所以一种解决方案是打开它,但我不建议这样做,因为它会执行许多数据库查询。
更好的选择是使用 Eager Loading:
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(
Context.Categories.Include(c => c.Products));
或
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(
Context.Categories.Include("Products"));
但是 AutoMapper 的最佳选择是使用 QueryableExtensions
:
中的 ProjectTo
方法
retirn Context.Categories.ProjectTo<CategoriesViewModel>();
由于 link 中解释的原因。
我正在使用 SQL Server 2012、MVC WebAPI、AutoMapper 和 Entity Framework。 在数据库中,我有两个具有一对多关系的表,例如类别和产品;一个类别可以有更多的产品,但一个产品只能有一个类别。我想要的是一个 json,每个类别还包含一个 Products.CategoryId 字段的相关产品数组。
这是我在网上搜索后做出的:
public class CategoriesViewModel
{
public string CategoryName { get; set; }
public IEnumerable<ProductsViewModel> Products { get; set; }
}
public class ProductsViewModel
{
public string Name { get; set; }
}
public static class ViewModelMapper
{
public static TDestination Map<TDestination>(object source)
{
return Mapper.Map<TDestination>(source);
}
public static void RegisterMaps()
{
AutoMapper.Mapper.Initialize(config =>
{
config.CreateMap<Products, ProductsViewModel>().ReverseMap();
config.CreateMap<Categories, CategoriesViewModel>()
.ForMember(dest => dest.Products, opt => opt.MapFrom(src => src.Products))
.ReverseMap();
}
}
}
// Repository
public IEnumerable<CategoriesViewModel> GetCategories()
{
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(Context.Categories);
}
//Business Logic
public IEnumerable<CategoriesViewModel> GetCategories()
{
return Repository.GetCategories();
}
[Route("Categories"), HttpGet]
public IHttpActionResult GetCategories()
{
return Ok(BL.GetCategories());
}
我的结果是一个包含空或空产品数组的类别列表,我找不到解决方案。
我怎样才能达到我的结果? 谢谢
编辑:
Entity Framework 型号
public partial class Category
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Category()
{
this.Products = new HashSet<Product>();
}
public int CategoryId { get; set; }
public string CategoryName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Product> Products { get; set; }
}
public partial class Product
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public string ProductName { get; set; }
public virtual Category Category { get; set; }
}
Category 和 Product 只是示例,如果视图模型 属性 名称不同则忽略。
我怀疑你 Lazy Loading 关闭了。
所以一种解决方案是打开它,但我不建议这样做,因为它会执行许多数据库查询。
更好的选择是使用 Eager Loading:
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(
Context.Categories.Include(c => c.Products));
或
return ViewModelMapper.Map<IEnumerable<CategoriesViewModel>>(
Context.Categories.Include("Products"));
但是 AutoMapper 的最佳选择是使用 QueryableExtensions
:
ProjectTo
方法
retirn Context.Categories.ProjectTo<CategoriesViewModel>();
由于 link 中解释的原因。