【问题标题】:LINQ unpredictable output [duplicate]LINQ不可预测的输出[重复]
【发布时间】:2015-01-16 07:47:13
【问题描述】:

在编写 LINQ 查询时,我无法找到使用 into 关键字的查询输出为何如此之类的原因。请检查一下代码并解决我的问题。

 class Person_1
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    class Pet
    {
        public string Name { get; set; }
        public string Owner { get; set; }
    }


 static void GroupJoinMethod()
        {
            Person_1 magnus = new Person_1 { LastName = "Hedlund",FirstName = "Magnus"  };
            Person_1 terry = new Person_1 {LastName = "Adams", FirstName = "Terry" };
            Person_1 charlotte = new Person_1 { LastName = "Weiss", FirstName = "Charlotte" };
            Person_1 arlene = new Person_1 {LastName = "Huff", FirstName = "Arlene" };
            Person_1 dummy = new Person_1 { LastName = "Williams", FirstName = "Magnus" };

            Pet barley = new Pet { Name = "Barley",Owner="Terry"};//, Owner = terry };
            Pet boots = new Pet { Name = "Boots",Owner="Terry"};//, Owner = terry };
            Pet whiskers = new Pet { Name = "Whiskers",Owner="Charlotte"};//, Owner = charlotte };
            Pet bluemoon = new Pet { Name = "Blue Moon",Owner="Terry"};//, Owner = terry };
            Pet daisy = new Pet { Name = "Daisy",Owner="Magnus"};//, Owner = magnus };

            List<Person_1> peoples = new List<Person_1> { magnus, terry, charlotte, arlene,dummy };
            List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };

 Console.WriteLine("\n\nVia Select into\n\n");
            var result2 = from people in peoples
                          join pet in pets
                          on people.LastName equals pet.Owner
                          into gj
                          select new { people.FirstName };

            foreach (var str in result2)
            {
                Console.WriteLine(str.FirstName);
            }
}

输出:

Via Select into

Magnus
Terry
Charlotte
Arlene 
Magnus

为什么当我的加入条件不正确时输出会出现。当我删除时没有输出。 in this.into关键字有什么影响。请帮忙

【问题讨论】:

  • 使用into 关键字的联接称为GroupJoin。见:msdn.microsoft.com/en-us/library/bb311040.aspx
  • 你似乎没有使用分组变量gj
  • 你穿过人。您尝试按宠物对它们进行分组,但最终您抓住了 people.FirstName。正在使用的分组不是
  • 查看副本。简而言之:into 的输出不是“不正确”,即正确,因为它是某种外连接。
  • 非常感谢您提供的链接 Soner Sir ......现在我明白为什么我不能在创建匿名类型时使用 pet.Owner ......

标签: c# .net linq


【解决方案1】:
Into

Into 关键字允许创建一个临时变量以将组、连接或选择子句的结果存储到新变量中。

             var em = from e in emp
                      group e by new{ e.DeptId}
                      into gEmp 
                      where gEmp.Count() > 1
                      select new { gEmp.Key.DeptId, salary = gEmp.Sum(t => t.Salary) };

在上面的查询中,应用到on分组后,它创建了一个IGrouping类型的gEmp变量,用于应用下一个过滤器。

【讨论】:

  • 虽然这通常是正确的,但作为答案,您会混淆 GroupJoin 和 GroupBy
【解决方案2】:

使用 into 关键字将结果“保存”到 gj 变量中,并在原始集合 peoples 上执行选择。确实,您检索了人们的所有名字

【讨论】:

    【解决方案3】:

    MSDN 话:感谢 Soner Sir 提供参考 http://msdn.microsoft.com/en-us/library/bb311040.aspx 组连接产生一个分层结果序列,它将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。组连接在关系方面没有等价物;它本质上是一个对象数组序列。 如果没有找到右源序列中的元素与左源中的元素匹配,则连接子句将为该项目生成一个空数组。因此,除了将结果序列组织成组之外,组连接基本上仍然是内等连接。 如果您只是选择组加入的结果,您可以访问这些项目,但您无法识别它们匹配的键。因此,通常将组连接的结果选择为同样具有键名的新类型更有用,如前面的示例所示。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2015-07-02
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2012-07-10
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多