将linqExpression转换为dictonary键值

时间:2016-10-27 11:04:53

标签: c# asp.net-mvc linq

我有以下表达式:

var products = loadOrdr.Payload.LoadOrderVehicles.SelectMany(l => l.LoadOrderComps)
.Select(t => t.Transfer)
.GroupBy(p => p.Product.Name)
.Select(s => s.Sum(p => p.DelVolumeData.VL)).toList();

我有一个列表,其中包含以下信息:

---Product--- ---Value---

   M1              10

   M1              10

   M1              10

   M2              10

   M2              10

列表可以有所不同,包含更多棕褐色的两个项目,我想将其分组,使其看起来像:

---Product--- ---SumValue---

   M1              30

   M2              20

对象结构:

public class LoadOrderVehicle : DomainBase
{
    public long LoadOrderId { get; set; }

    [DBIgnore]
    public List<LoadOrderComp> LoadOrderComps { get; set; }
}

   public class LoadOrderComp : DomainBase
    {
        public long LoadOrderVehicleId { get; set; }

        [DBIgnore]
        public Transfer Transfer { get; set; }

       [DBIgnore]
       public VehicleComp VehicleComp { get; set; }
   }

// data I want to group is here:
    public class Transfer : DomainBase
    {
        [DBIgnore]
        public VolumeData OrdVolumeData { get; set; }

        [DBIgnore]
        public Product Product { get; set; }
    }

Linq不是我强大的一面,我自己的linq没有任何结果。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

var products = loadOrdr.Payload
                       .LoadOrderVehicles
                       .SelectMany(l => l.LoadOrderComps)
                       .Select(t => t.Transfer)
                       .GroupBy(p => p.Product.Name)
                       .Select(gr => new 
                        {
                            ProductName = gr.Key,
                            Total = gr.Sum(p => p.DelVolumeData.VL)
                        })
                       .ToDictinary(x=>x.ProductName, x=>x.Total);

您遇到的唯一问题是Select之后的最后一次投影GroupBy。在那里,您需要进行分组的密钥以及相应组项的DelVolumeData.VL总和。

答案 1 :(得分:2)

您只需:

.GroupBy(p => p.Product.Name,(pk,s) => 
                                   new {
                                        Key = pk,
                                        Sum = s.Sum(p => p.DelVolumeData.VL)
                                       }) 

这将导致IEnumerable<Anonymous{string,int}>,假设Namestringp.DelVolumeData.VL为int

现在您可以致电ToDictionary并获取Dictionary<string,int>

修改后的代码:

var products = loadOrdr.Payload.LoadOrderVehicles
                      .SelectMany(l => l.LoadOrderComps)
                      .Select(t => t.Transfer)
                      .GroupBy(p => p.Product.Name,
                              (pk,s) => 
                               new {
                                    Key = pk,
                                    Sum = s.Sum(p => p.DelVolumeData.VL)
                                   })
                      .ToDictionary(p => p.Key,p => p.Sum);

答案 2 :(得分:0)

感谢您的回复,但上述内容都没有给我带来惊人的结果。在朋友的帮助下,我解决了这个问题。我为迟到的回复道歉,我在部署之前还有其他的事情要做。

这有效:

        var transfers = loadOrdr.Payload.LoadOrderVehicles
            .SelectMany(lov => lov.LoadOrderComps)
            .Select(loc => loc.Transfer);

        var products = transfers
            .GroupBy(t => t.Product.Name)
            .ToDictionary(
                g => g.Key,
                g => transfers
                .Where(x => x.Product.Name.Equals(g.Key))
                .Sum(y => y.DelVolumeData.VL));