TL; DR:代码应该显示我的意图,它出错的地方在输出语句中,我试图设置StatusItemDTOs,它应该包含所有的来自匿名对象的字段,LocationName。
除外我试图查询我的数据库并仅使用投影提取我需要的字段。 目标结果是包含StatusItemDTOs的LocationDTO。困难的部分是在一个查询中映射多个DTO。
出错的地方在输出语句中我试图设置StatusItemDTOs,我不知道如何从字典值中做出来。 如果您查看本文底部的DTO类,您可以看到StatusItemDTO包含匿名对象的所有字段,LocationName除外。我制作匿名对象的唯一原因是因为我不知道如何存储"如果我只是选择新的StatusItemDTOs,那么就是LocationName。
我非常自信这个查询可以做得更短,更聪明,但我对投资DTO缺乏经验,希望你能提供帮助。
var query = (from liq in Context.LocationItemQuantities
where liq.Location.DepotId == depotId
select new
{
LocationName = liq.Location.Name,
ItemTypeName = liq.ItemType.Name,
DepotQuantity = liq.Quantity,
StandardQuantity = liq.StandardQuantity,
MinimumQuantity = liq.MinQuantity,
}).ToList();
var output = from anon in query
group anon by anon.LocationName into g
select new LocationDTO
{
LocationName = g.Key,
StatusItemDTOs = g
};
我的DTO:
public class StatusItemDTO
{
public int DepotQuantity { get; set; }
public string ItemTypeName { get; set; }
public DateTime ExpirationDate { get; set; }
public int StandardQuantity { get; set; }
public int? MinimumQuantity { get; set; }
}
public class LocationDTO
{
public List<StatusItemDTO> StatusItemDTOs { get; set; }
public string LocationName { get; set; }
}
编辑:实体类
public class LocationItemQuantity : IEntity
{
public int Id { get; set; }
public int Quantity { get; set; }
public int? MinQuantity { get; set; }
public int StandardQuantity { get; set; }
public bool IsChecked { get; set; }
public int LocationId { get; set; }
public Location Location { get; set; }
public int ItemTypeId { get; set; }
public ItemType ItemType { get; set; }
}
public class Location : IEntity
{
public int Id { get; set; }
public List<LocationItemQuantity> LocationItemQuantities { get; set; }
public string Name { get; set; }
public int? DepotId { get; set; }
public Depot Depot { get; set; }
}
public class ItemType : IEntity
{
public int Id { get; set; }
public string InternBarcode { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public List<LocationItemQuantity> LocationItemQuantities { get; set; }
public List<ProductBatch> ProductBatches { get; set; }
public List<Product> Products { get; set; }
}
答案 0 :(得分:1)
您可以直接投影到DTO,而无需使用以下匿名类型:
var result =
Context
.LocationItemQuantities
.Where(x=> x.Location.DepotId == depotId)
.GroupBy(x => x.Location.Name)
.Select(x => new LocationDTO
{
LocationName = x.Key,
StatusItemDTOs = x.Select(y => new StatusItemDTO
{
DepotQuantity = y.Quantity,
StandardQuantity = y.StandardQuantity,
MinimumQuantity = y.MinQuantity,
ItemTypeName = y.ItemType.Name
}).ToList()
})
.ToList();