好吧,大家......第一次在这里发布一个问题。我试图演示一些LINQ的功能,并遇到了一些障碍。下面的查询不会达到预期效果:LINQ到对象 - 这个简单的复合关键分组有什么问题?
Dim peopleByAgeAndName = _
From p In (New PeopleRepository).GetAll
Group By key = New With {p.Age, p.Name} Into Group
Select Group
这里是非常简单PeopleRepository:
Public Class PeopleRepository
Public Function GetAll() As List(Of Person)
Dim people As New List(Of Person)
people.Add(New Person With {.Name = "Test Name #1", .Age = 33})
people.Add(New Person With {.Name = "Test Name #1", .Age = 33})
people.Add(New Person With {.Name = "Test Name #2", .Age = 0})
people.Add(New Person With {.Name = "Test Name #3", .Age = 0})
people.Add(New Person With {.Name = "Test Name #4", .Age = 0})
people.Add(New Person With {.Name = "Test Name #5", .Age = 35})
people.Add(New Person With {.Name = "Test Name #1", .Age = 39})
Return people
End Function
End Class
这里是更简单的Person类:
Public Class Person
Property Name As String
Property Age As Integer
End Class
显然,这是所有代码设置用于测试目的。执行peopleByAgeAndName
查询后,我预计会得到6个组。每个对象都包含一个Person对象,除了与“Test Name#1”对应的组以及年龄为33的组。不管我做什么,我都会得到7组每个元素。
有什么想法?我想知道这对LINQ-to-Objects来说是否正常?再次,这是所有的测试代码。我只是想更好地理解这是如何工作的。我的理解是,当使用匿名对象作为关键字时,它应该对组进行属性和属性的比较。我应该得到6组,而不是7.
谢谢!
更新 -
根据记录,在C#中改写了查询执行完全按照我期望:
var peopleByAgeAndName =
from p in peopleRepository.GetAll()
group p by new {p.Age, p.Name} into g
select g;
我得到6组,而不是7。我还证实,组密钥不可用在VB中,但在C#中。有点奇怪。
我知道我需要这样做,如果我在我的复合键中使用自定义类型作为条件,但由于我使用的是匿名类型的字符串,Integer ...我不认为我应该必须实施一个IEqualityCOmparer。它不应该试图比较Person对象。只是钥匙。 – 2011-05-04 17:38:51