LINQ GroupBy子集合属性

时间:2016-04-05 21:45:57

标签: c# linq

我试图找到一种使用LINQ对列表进行分组的方法,不仅仅是Foo对象的属性(EmployeeId,CompanyId和GroupId),而且只有在Baz对象的StartDate和EndDate属性准确的情况下才对它们进行分组。相同。目标是按EmployeeId,CompanyId和GroupId进行分组,并将Bars集合组合为所有分组记录的集合。

因此,如果List有三个对象,并且第一个对象上的Bars集合都是BazId = 1,第二个BazId = 2,第三个BazId = 3,我会期望一个结果,其中List包含两个对象,一个带有一个Bars BazIds为1和3的集合以及另一个具有BazIds为2的Bars集合的集合(因为1和3具有相同的开始/结束日期,如下所述)。

我希望这是有道理的。我已经醒了很长时间,如果不清楚,请告诉我,我会尽力澄清。

到目前为止我所拥有的是:

var result = foos.GroupBy(g => new { g.CompanyId, g.EmployeeId, g.GroupId })
        .Select(g => new Foo(g.Key.CompanyId, g.Key.EmployeeId, g.Key.GroupId)
        {
          Bars = g.SelectMany(x => x.Bars)}
).ToList();

但是,这会忽略相应Baz对象的StartDate / EndDate属性。我只想对其集合中具有共享相同开始/结束日期的BazId的Foo对象的记录进行分组。

编辑:给定Bars集合中的所有Bar对象都具有相同的BazId

是一项业务规则
public class Foo {
  public int EmployeeId { get; set; }
  public int CompanyId { get; set;
  public int GroupId { get; set; }

  public List<Bar> Bars { get; set; }
}


public class Bar {
  public BazId { get; set; }
  public string Name { get; set; }
}

public class Baz {
  public int Id { get; set; }
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

var baz = new List<Baz> {
  new Baz {
    Id = 1,
    StartDate = DateTime.Now,
    EndDate = DateTime.Now.AddMonths(1)
  },
  new Baz {
    Id = 2,
    StartDate = DateTime.Now.AddMonths(-1),
    EndDate = DateTime.Now.AddMonths(1)
  },
  new Baz {
    Id = 3,
    StartDate = DateTime.Now,
    EndDate = DateTime.Now.AddMonths(1)
  },
}

根据@jdweng的评论

,我最终得到的是这个
var result = foos.GroupBy(g => g, new FooComparer())
            .Select(g => new Foo(g.Key.CompanyId, g.Key.EmployeeId, g.Key.GroupId)
            {
              Bars = g.SelectMany(x => x.Bars)}
    ).ToList();

FooComparer内,我实施了IEqualityComparer<Foo>并创建了EqualsGetHashCode方法,通过检查Baz的{​​{1}}个集合来确定这两个方法是否相等每个

2 个答案:

答案 0 :(得分:1)

您似乎必须将开始日期和结束日期分组。为此你必须加入Baz。

---
my-array: <%= my_data_file %>
---

答案 1 :(得分:1)

尝试使用CompareTo()方法将继承添加到IComparable类。 Linq Groupby将使用CompareTo方法进行分组