Linq投影到DTO对象

时间:2016-05-05 19:21:00

标签: c# linq projection

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; }

}

1 个答案:

答案 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();