Linq和group by子句

时间:2013-08-10 09:51:31

标签: linq

我很好奇 x 在linq group by子句中的含义: group x by ...

x可以用1:

代替
       var query = from box in c.Boxes
                    join item in c.Items on box equals item.Box
                    group 1 by new { BoxId = box.BoxId, item.ItemType.ItemTypeId } into g
                    select new {  g.Key.BoxId, g.Key.ItemTypeId, Count = g.Count() };

有没有人有一个样本,其中x(或你在组中选择的wathever局部变量)确实有一些价值?

我的意思是

var query2 =  from box in c.Boxes
                              group box by box.BoxId into q
                              select q.Key;

可以替换为

var query2 =  from box in c.Boxes
                              group 1 by box.BoxId into q
                              select q.Key;

2 个答案:

答案 0 :(得分:2)

这是确定group by子句输出内容的表达式。

您实际上没有检查整个输出,只检查Keys,它们在上面的示例中是相同的,因为分组是由同一个事件(box.BoxId)完成的。

但是,请替换最后一行:

select q.Key;

select q;

你会注意到:

  • group 1 by ...查询将返回IGrouping<int, int>,其中所有值都设为1
  • group box by ...查询将返回IGrouping<int, Box>,其中包含所有boxId键,并且每个键都包含与分组条件相对应的Box个对象。

答案 1 :(得分:1)

在x组x中,x是聚合的东西。

所以你可以写点像

var childrenByAge = from child in class
                    group getName(child) by child.Age;

这为您提供了一个分组,其中包含每个年龄段的儿童姓名。

这是一个简单的例子,您可以轻松地测试差异:

    static void Main(string[] args)
    {
        var grouping = from c in "Hello World!"
                       group c by  c;  // Replace 'group c by' with 'group 1 by'
                                       // and compare results


        foreach (var group in grouping)
        {
            Console.Write("KEY:  {0} VALUES :", group.Key);
            foreach (var value in group)
                Console.Write(" {0}", value);

            Console.WriteLine();
        }

        Console.ReadKey();

    }