【发布时间】:2018-02-03 21:45:30
【问题描述】:
如何重新编写查询以将每个类别的所有产品包含在递归产品类别树中?此查询获取类别及其子项,因此我只是缺少产品:
var categories = _context.ProductCategories
.Include(e => e.Children)
.Where(e => e.ParentId == null)
.ToList();
实体模型:
public class ProductCategory
{
public int Id { get; set; }
public int SortOrder { get; set; }
public string Title { get; set; }
[ForeignKey(nameof(ParentCategory))]
public int? ParentId { get; set; }
// Nav.props:
public ProductCategory ParentCategory { get; set; }
public ICollection<ProductCategory> Children { get; set; }
public List<ProductInCategory> ProductInCategory { get; set; }
}
public class ProductInCategory
{
public int Id { get; set; }
public int ProductId { get; set; }
public int SortOrder { get; set; }
public int ProductCategoryId { get; set; }
// Nav.props:
public Product Product { get; set; }
public ProductCategory ProductCategory { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public string Info { get; set; }
public decimal Price { get; set; }
// Nav.props:
public List<ProductInCategory> InCategories { get; set; }
}
视图模型:
public class ViewModelProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int SortOrder { get; set; }
public string ProductCountInfo
{
get
{
return Products != null && Products.Any() ? Products.Count().ToString() : "0";
}
}
public ViewModelProductCategory ParentCategory { get; set; }
public IEnumerable<ViewModelProductCategory> Children { get; set; }
public IEnumerable<ViewModelProduct> Products { get; set; }
}
我正在使用 AutoMapper 将查询结果转换为视图模型。
这是我尝试渲染的方式:
索引视图:
@model IEnumerable<MyStore.Models.ViewModels.ViewModelProductCategory>
<ul style="list-style:none;padding-left:0px;">
@Html.Partial("_CategoryAndProductRecursive", Model)
</ul>
_CategoryAndProductRecursive.cshtml:
@model IEnumerable<MyStore.Models.ViewModels.ViewModelProductCategory>
<ul>
@if (Model != null)
{
foreach (var item in Model)
{
<li>
@item.Title
<ul style="list-style:none;">
@Html.Partial("_CategoryAndProductRecursive.cshtml", item.Children)
@if (item.Products != null)
{
@foreach (var product in item.Products)
{
<li>@product.Title</li>
}
}
</ul>
</li>
}
}
</ul>
【问题讨论】:
标签: c# linq recursion entity-framework-core