首页 > 解决方案 > 如何使用 LINQ 对 C# 中共享公共键值的两个不同对象列表进行分组连接?

问题描述

我想将这两个列表与共同的密钥一起加入日期,但无论我尝试什么都行不通,有什么建议吗?

课程:

  public class item_mod 
   {
       [JsonProperty(PropertyName = "item.price")]
       public string price { get; set; }

       [JsonProperty(PropertyName = "item.name")]
       public string name { get; set; }

       [JsonProperty(PropertyName = "@modify_stamp")]
       public string stamp { get; set; }

       [JsonProperty(PropertyName = "$trans")]
       public string trans { get; set; }

       [JsonProperty(PropertyName = "trans.date")]
       public string date { get; set; }
   }


public class trans_mod 
   {
   [DataMember]
   public string refer { get; set; }

   [DataMember]
   public string date { get; set; }

   [DataMember]
   public string time { get; set; }

   [DataMember]
   public string location { get; set; }

   [DataMember]
   public int points { get; set; }

   [DataMember]
   public string _total { get; set; }

   [DataMember]
   public string _discount { get; set; }

   [JsonProperty(PropertyName = "$$position")]
   public string position { get; set; }

   [JsonProperty(PropertyName = "@modify_stamp")]
   public string stamp { get; set; }

   [JsonProperty(PropertyName = "$trans")]
   public string trans { get; set; }
   }

列表:(我将它们分组,日期是关键)

var q1 = it.GroupBy(x => x.date)
                          .Select(g => new
                          {
                              Date = g.Key,
                              Details = g.Select(x => new
                              {
                                  Name = x.name,
                                  Price = x.price,
                                  Trans = x.trans,
                              })
                            .ToList()
                          })
                  .ToList();
var q2 = t.GroupBy(x => x.date)
                          .Select(g => new
                          {
                              Date = g.Key,
                              Details = g.Select(x => new
                              {
                                  Location = x.location,
                                  Points = x.points,
                                  Pos = x.position,
                                  Time = x.time,
                                  Discount = x._discount,
                                  Totals = x._total,
                                  Trans = x.trans,
                                  Ref = x.refer
                              })
                            .ToList()
                          });

我想将这两个合并到一个群组中 - 有什么建议吗?

到目前为止我已经尝试过:

var query = from trans in q2
                                 join item in q1 on q2 equals q1.Date into gj
                                 select new { Date = q2.Date, Item = gj }; 

=> 不起作用返回空白

var mergedList = q1.Union(q2).ToList(); 

=> 也不起作用。

任何帮助表示赞赏,我还注意到我对面向对象编程非常陌生,我只是想弄清楚如何做事!

标签: c#linq

解决方案


您可以通过 SelectMany 合并

var query = q2.SelectMany(x =>
              q1.Where(z => z.Date == x.Date)
                .Select(z => new
                 {
                     Date=z.Date,
                     q1Details = z.Details,
                     q2Details= x.Details
                 })
        ).ToList();

推荐阅读