我有包含自我参考的项目列表。例如:
型号
public class Stock{
public int StockId { get; set; }
public int? ParentStockId { get; set; }
public int Level { get; set; }
public string Name { get; set; }
}
视图模型
public class StockViewModel {
public int Level { get; set; }
public string Name { get; set; }
public IEnumerable<StockViewModel> SubStock { get; set; }
}
样本数据
var stocks = new List<Stock> {
new Stock{ StockId = 1, Level = 10, Name = "Root1" },
new Stock{ StockId = 2, Level = 10, Name = "Root2" },
new Stock{ StockId = 3, ParentStockId = 1, Level = 20, Name = "Area1" },
new Stock{ StockId = 4, ParentStockId = 2, Level = 20, Name = "Area2" },
new Stock{ StockId = 5, ParentStockId = 3, Level = 30, Name = "Box11" },
new Stock{ StockId = 6, ParentStockId = 3, Level = 30, Name = "Box12" },
new Stock{ StockId = 7, ParentStockId = 4, Level = 30, Name = "Box21" }
};
我使用类似的代码来达到预期的效果。但我确定这是错的。我必须在每个新请求之前进行配置。
var mapper = new Mapper();
TypeAdapterConfig<Stock, StockViewModel>
.NewConfig()
.Map(dst => dst.SubStock, src => stocks.Where(x => x.ParentStockId == src.StockId).ToList());
var viewStocks = mapper.Map<IEnumerable<Stock>, IEnumerable<StockViewModel>>(stocks.Where(x => x.ParentStockId == null));
// Sample output
foreach (var stock in viewStocks){
Console.WriteLine(stock.Level.ToString() + " " + stock.Name);
if (stock.SubStock != null)
foreach (var stock1 in stock.SubStock){
Console.WriteLine(" " + stock1.Level.ToString() + " " + stock1.Name);
if (stock1.SubStock != null)
foreach (var stock2 in stock1.SubStock){
Console.WriteLine(" " + stock2.Level.ToString() + " " + stock2.Name);
}
}
}
小提琴
如何映射viewStocks
分层?如同
10 Root1
20 Area1
30 Box11
30 Box12
10 Root2
20 Area2
30 Box21