LINQ无法预测的输出

时间:2015-01-16 07:47:14

标签: c# .net linq

在编写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

为什么当我的连接条件不正确时输出即将到来。当我删除时没有输出。在此关键字中对关键字的影响是什么。请帮助

3 个答案:

答案 0 :(得分:1)

Into

Into关键字允许创建临时变量,以将group,join或select子句的结果存储到新变量中。

             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) };

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

答案 1 :(得分:0)

使用into关键字你&#34;保存&#34;结果连接到gj变量,并在原始集合上执行选择。实际上你检索了所有人的名字

答案 2 :(得分:0)

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