【问题标题】:LINQ: Select a column based on another column valueLINQ:根据另一列值选择一列
【发布时间】:2018-09-17 13:53:24
【问题描述】:

执行一些 LINQ 后,我将这些数据作为匿名类型的 IQueryable

Cat  Type  Count
----------------
A     1     10
B     1     15
C     1     25
D     1     5
A     2     15
C     2     30
D     2     20
B     2     10

现在,对于每只猫,我想使用 LINQ 根据类型值选择计数。

输出应该是这样的:

Cat  Type1Count  Type2Count
---------------------------
A       10           15
B       15           10
C       25           30 
D       5            20

【问题讨论】:

  • 你试过什么?我们不是来做你的工作,即思考尝试再思考
  • 定义“像这样”。 Type 列是否被限制为 1 和 2,还是您真的要转置?
  • 嗨,Amir,您在这个社区已有 4 年多的时间了,您已经提出了 14 个问题并且没有标记任何已接受的答案。没有冒犯,但在这一点上,您实际上应该知道,社区并不真正喜欢被视为一种代码编写服务,您可以在其中转储需求并收获工作代码。您至少可以发布 1 次尝试
  • @MongZhu 我的朋友,我的大部分问题都没有答案,或者只有一个答案不是我接受的答案。我该怎么办?我应该接受一个不是我接受的答案吗?无论如何,也许这是我的错误,从现在开始我会尽力在这个社区中正确合作。感谢您的评论。
  • 如果您得到的答案不令人满意,那么您当然不应该接受它们。我把这个拿回来。但是,在您自己的问题上解决问题的第一次尝试仍然有效。当帖子看起来像是在利用人们的慷慨时,它只是不会给人留下好印象。快乐的编码伙伴。

标签: c# sql sql-server linq


【解决方案1】:

你可以尝试使用groupby 然后select 来做pivot。

var query = myList
    .GroupBy(c => c.Cat)
    .Select(g => new {
        Cat  = g.Key,
        Type1Count = g.Where(a => a.Type == 1).Sum(c => c.Count),
        Type2Count = g.Where(a => a.Type == 2).Sum(c => c.Count)
    });

c# online

结果

Cat:A  Type1Count:10  Type2Count:15
Cat:B  Type1Count:15  Type2Count:10
Cat:C  Type1Count:25  Type2Count:30
Cat:D  Type1Count:5  Type2Count:20

【讨论】:

  • 对于您的小提琴和结果,您似乎误读了类型 2,行在 OP 示例中为 ACDB。否则,它会导致与 OP 预期相同的结果。我没有对你的答案投票,但我相信你得到的一个反对票是因为你回答了一个应该关闭的问题
  • @D-Shih 谢谢我的朋友
【解决方案2】:

所以基本上你需要按 Cat 和 Type 分组并得到 Count 的总和:

myList.GroupBy(x => new { x.Cat, x.Type }).Select(x => new { Cat = x.Key.Cat, Type = x.Key.Type, CountForTypeAndCat = x.Sum(y=>y.Count) })

这将允许您获取任何类型的信息,而不仅仅是 1 和 2

foreach (var item in query.OrderBy(x=>x.Cat).ThenBy(x=>x.Type))
{
     Console.WriteLine(string.Format("Cat:{0}  Type:{1}  CountForTypeAndCat:{2}", item.Cat, item.Type, item.CountForTypeAndCat));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多