LINQ Group通过列表<>

麦克阿泰

我有一个简单的LINQ查询,它试图执行GroupBy,其中语句中的一项是 List<string>.

var viewModel = reports
       .GroupBy(c => new { c.Id, c.PetList })
       .Select(g => new ArmReportModel
        {
            PetList = g.Key.PetList,
            Pets = g.Count()
        });

在此语句之前,我正在执行我的EF存储库方法,该方法最终将调用一个方法来创建上述PetList。

如果我从中删除PetList,GroupBy()它会按预期工作。为了按List<string>类型分组,我必须做些什么吗?

乔恩·汉纳

我假设这Id是一个标识符,因此任何两个c相同的Id对象实际上是相同的,并且具有相同的PetList因此,我们可以GroupById并得到PetList另一种方式:

var viewModel = reports
  .GroupBy(c => c.Id)
  .Select(g => new ArmReportModel
  {
    PetList = g.First().PetList, // Might need FirstOrDefault() with some providers
    Pets = g.Count()
  });

除非那个,我想首先要确保我可以用一IEqualityComparer<T>GroupBy如果提供者允许的话,那就没问题了。否则,我将从以下内容开始:

reports.Select(c => new {c.Id, c.PetList}).AsEnumerable()

这会将提供程序所需的最小值检索到内存中,以便从那时起可以使用linq-to-objects提供程序。

我需要能够IEqualityComparer<T>为some定义一个T,因此我停止使用匿名类型:

private class IdAndList
{
  public int Id { get; set; }
  public List<string> PetList { get; set; }
}

private class ReportIdAndPetListComparer : IEqualityComparer<IdAndList>
{
  public bool Equals(IdAndList x, IdAndList y)
  {
    if (ReferenceEquals(x, y)) return true;
    if (x == null || y == null) return false;
    if (x.Id != y.Id) return false;
    if (x.PetList == null) return y.PetList == null;
    if (y.PetList == null) return false;
    int count = x.PetList.Count;
    if (y.PetList.Count != count) return false;
    for (int i = 0; i != count; ++i)
      if (x.PetList[i] != y.PetList[i]) return false;
    return true;
  }

  public int GetHashCode(IdAndList obj)
  {
    int hash = obj.Id;
    if (obj.PetList != null)
      foreach (string pet in obj.PetList)
        hash = hash * 31 + pet.GetHashCode();
    return hash;
  }
}

PetList如果您知道不可能的话,可以删除某些针对null测试

现在:

var viewModel = reports.Select(c => new IdAndList{c.Id, c.PetList}).AsEnumerable()
    .GroupBy(c => c, new ReportIdAndPetListComparer())
    .Select(g => new ArmReportModel
    {
        PetList = g.Key.PetList,
        Pets = g.Count()
    });

或者,如果提供者无法处理构造IdAndPetList类型,则:

var viewModel = reports.Select(c => new {c.Id, c.PetList})
    .AsEnumerable()
    .Select(c => new IdAndList{c.Id, c.PetList})
    .GroupBy(c => c, new ReportIdAndPetListComparer())
    .Select(g => new ArmReportModel
    {
        PetList = g.Key.PetList,
        Pets = g.Count()
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linq Group通过将每个空值作为组

来自分类Dev

Linq Group by,将子实体连接并加载到列表中

来自分类Dev

Linq-通过内的标签缩小事件的列表对象

来自分类Dev

LINQ Group通过选择多对多关联表

来自分类Dev

Linq Group通过加入

来自分类Dev

在C#中通过LINQ比较两个列表?

来自分类Dev

通过LINQ +条件从数组中获取C#列表

来自分类Dev

LINQ Group通过求和

来自分类Dev

LINQ Group嵌套列表用于重组数据

来自分类Dev

Linq Group通过在谓词中传递

来自分类Dev

Linq to Entities通过变量列表获取实体列表

来自分类Dev

封装LINQ Group通过选择

来自分类Dev

LINQ Group通过列表<>

来自分类Dev

使用linq OrderBy通过ID排序列表

来自分类Dev

LINQ:如何通过group by子句获取最大ID?

来自分类Dev

通过LINQ使用Fluent语法嵌套的Group

来自分类Dev

如何从对象列表中删除(通过linq)重复项

来自分类Dev

Linq Group通过多列投影到新对象

来自分类Dev

Linq选择订单然后通过Kendo下拉列表

来自分类Dev

如何通过Linq合并列表?

来自分类Dev

通过LINQ查询将ServiceController对象绑定到列表

来自分类Dev

Linq Group by,将子实体连接并加载到列表中

来自分类Dev

通过LINQ迭代到包含COUNT和GROUP BY的SQL查询

来自分类Dev

LINQ Group通过使用多个条件

来自分类Dev

通过Linq,实体框架更新列表项

来自分类Dev

Linq Group通过与通过谓词一起传递

来自分类Dev

LINQ Group通过多列和计数

来自分类Dev

在LINQ中使用group by填充对象列表

来自分类Dev

通过 linq 的 ToList 方法从 IOrderedQueryable 构造列表