Linq和GROUPBY子句

Linq和GROUPBY子句,linq,Linq,我很好奇x在linq group by子句中的作用是什么:groupxby 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

我很好奇x在linq group by子句中的作用是什么:groupxby

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(或您在group by中选择的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;

这是一个表达式,用于确定
group by
子句的输出内容

实际上,您并不是在检查整个输出,而是只检查
,它们在上面的示例中是相同的,因为分组是由相同的东西(
box.BoxId
)完成的

但是,请替换最后一行:

select q.Key;

你会注意到:

  • group1by…
    查询将返回一个
    i分组
    ,该分组将所有值设置为1
  • groupbox by…
    查询将返回一个
    IGrouping
    ,该查询将包含所有的boxId键,以及与分组条件相关的对应的
    box
    对象

在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();

    }

您可以使用expression而不是
x
。x是分组依据聚合的内容。因此,用1替换它没有多大意义,因为每个组都需要一个充满1的IEnumerable
    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();

    }