Linq会产生冗余吗?

5
我参考了如何使用联接使用Linq组合数据的示例中的内容。我们有两个列表,第一个列表包含人员对象(名字和姓氏)。第二个列表包含宠物对象(名称),并且包含一个人员对象(宠物主人)。一个人可能拥有>=0个宠物。
现在发生的事情是我执行了组连接。
Dim result1 = From pers in people
            Group Join pet in pets
            on pers Equals pet.Owner
            Into PetList = Group

LinqPad向我展示了结果:

LinqPad输出

这看起来像是Linq产生了很多冗余(但我可能在这里错了!)。第一个结果对象将三次保存person对象。作为一个Linq的新手,这里有两个问题(也许我没有正确地阅读输出):

  1. person对象是引用吗?不幸的是,我找不到任何相关信息。
  2. 按照上面提到的示例,查询继续进行下去
Select pers.FirstName , pers.LastName,
PetName = If(pet is Nothing, String.Empty, pet.Name)
如果我们在PetList中已经拥有了关于Person Object的所有信息,为什么不直接查询这个对象呢?在我看来,我们不再需要pers Object了。

我认为这里的关键事实是linq使用延迟执行,而且应该编译成一种格式,这意味着这些冗余尽可能不会被创建。 - Sayse
1个回答

4
是的,那些Person对象是引用。LINQ不会对Person对象进行克隆。
输出结果的原因是LINQPad试图向您展示该人是谁。为了避免重复遍历其属性和字段,很难确定它所指的人是谁。

感谢您的回答!这意味着LINQPad显示了Key=Person对象,但它并不在.NET生成的实际对象中?我刚刚检查了一下,PetList中只有Pet和Owner属性。我理解您的意图,但仍然感到困惑。 - ruedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接