【问题标题】:How to group the linq query by two id's如何按两个 id 对 linq 查询进行分组
【发布时间】:2012-12-21 09:30:49
【问题描述】:

如何使用两个 ID 分组;我有类似的数据

empid: 1, usrid: 1, profid: 1
empid: 1, usrid: 1, profid: 2
empid: 2, usrid: 1, profid: 5

我写过类似的查询

var query = (from i in data
         group i by new { i.empid, i.usrid} into g
         select new {                         
         profileid = g.Select(z=>z.profileid).ToArray()                         
         }).ToArray();

现在对于empid:1usrid:1,我想获取配置文件ID 作为1,2 的数组 对于empid:2usrid:1,我想将prof id 设为5

但我得到了每条记录中的所有三个值,例如1,2,5

我怎样才能使用 linq 获得它

【问题讨论】:

  • 它必须在你的数据中。你所展示的没有任何问题。也许您可以显示一个完整的运行代码 sn-p 来显示意外行为。
  • @MitchWheat 问答展示了如何按多列分组,但这不是这里的问题。
  • @GertArnold 是的,你现在是我明白了,谢谢

标签: mysql sql sql-server linq linq-to-sql


【解决方案1】:

我发现当我按步骤执行时更容易看到发生了什么。

首先对数据进行分组

var grouped = data.GroupBy(d => new { d.empid, d.userid });

然后选择结果

var results = grouped.Select(g => g.Select(d => d.profid).ToArray());

每个g 都是由一对empiduserid 锁定的组。该组是您的类的实例集合。所以上面的语句说要从每个组(每个 empid userid 对)中创建一个 profids 数组。结果是

[1, 2]
[5]

这会得到你想要的数组,但是你会丢失密钥。我不知道你想对结果做什么,所以这可能没问题,但可能不是。无论哪种方式,组都包含您想要的键和值。

解决此问题的另一种方法是使用 GroupBy 的不同重载来获取 profid 作为值。

var grouped2 = data.GroupBy(d => new { d.empid, d.userid }, d => d.profid);

这将为您提供一个组,其键是empiduserid 对,集合只是profids。这更有可能更接近您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2021-02-17
    • 2022-07-21
    • 1970-01-01
    • 2011-07-16
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多