我有一个递归结构类别树的实体模型:
public class ProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int SortOrder { get; set; }
public ProductCategory ParentCategory { get; set; } //nav.prop to parent
public ICollection<ProductCategory> Children { get; set; } = new List<ProductCategory>();
public ICollection<ProductInCategory> ProductInCategory { get; set; }
public ICollection<FrontPageProduct> FrontPageProduct { get; set; } // Nav.prop. to front page product
// Recursive sorting:
public void RecursiveOrder()
{
Children = Children.OrderBy(o => o.SortOrder).ToList();
Children.ToList().ForEach(r => r.RecursiveOrder());
}
}
......据说匹配ViewModel:
public class ViewModelProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int SortOrder { get; set; }
public bool Checked { get; set; } // Used for assigning a product to multiple categories in Product/Edit
// Nav.props:
public ViewModelProductCategory ParentCategory { get; set; } // Nav.prop. to parent
public ICollection<ViewModelProductCategory> Children { get; set; } // Nav.prop. to children
public IEnumerable<ViewModelProduct> Products { get; set; } // Products in this category
public IEnumerable<ViewModelFrontPageProduct> FrontPageProducts { get; set; }
public string ProductCountInfo { get { return Products?.Count().ToString() ?? "0"; } }
}
当我尝试填充viewmodel时,如下所示:
List<ProductCategory> DbM =
await _context.ProductCategories
.Include(c => c.Children)
.Where(x => x.ParentId == null)
.OrderBy(o => o.SortOrder)
.ToListAsync();
foreach (var item in DbM)
{
VMSelectCategories.Add(
new ViewModelProductCategory{
Id = item.Id,
Children = item.Children,
Title = item.Title
});
}
VisualStudio尖叫我无法将ProductCategory
隐式转换为ViewModelCategory
。这发生在Children = item.Children
。
为什么不工作?我不能在视图模型中使用与原始实体模型无关的其他属性吗?与Checked
和ProductCountInfo
一样?
答案 0 :(得分:1)
在这一行:
Children = item.Children,
Children
是ViewModelProductCategory.Children
属性,类型为ICollection<ViewModelProductCategory>
,而item.Children
是ProductCategory.Children
属性,类型为ICollection<ProductCategory>
。它们是不同的类型,既不继承也不实现另一个,那么为什么你希望能够将一种类型的对象分配给另一种类型的属性?你希望这可行吗?
var list1 = new List<int> {1, 2, 3};
List<string> list2 = list1;
当然不是(我希望)因为将List<int>
对象分配给List<string>
变量会很愚蠢。你要做的事情是完全一样的。您需要提供一些方法来从一种类型转换为另一种类型,然后在您的代码中实现它。一个选项可能是这样的:
Children = item.Children.Select(pc => MapToViewModel(pc)).ToList(),
其中MapToViewModel
是您编写的方法,用于创建ViewModelProductCategory
并从ProductCategory
参数填充其属性。
您可能还会考虑使用类似AutoMapper的内容。