Linq加入多个属性

时间:2009-06-16 22:15:01

标签: vb.net linq

以下两个查询在功能上是否相同? 第一个不返回任何数据,但第二个工作正常,输入相同。 我的第一个查询出了什么问题?

Dim LTest2 As IEnumerable = From e1 As QNCEntity In Shape.Entities _
                        Join e2 As QNCEntity In Shape.Entities _
                        On New With { _
                                     .X = CDbl(e1.EntObj.X2), _
                                     .Y = CDbl(e1.EntObj.Y2) _
                                    } _
                        Equals New With { _
                                           .X = CDbl(e2.EntObj.X1), _
                                           .Y = CDbl(e2.EntObj.Y1) _
                                        }

Dim LTest3 As IEnumerable = From e1 As QNCEntity In Shape.Entities _
                               Join e2 As QNCEntity In Shape.Entities _
                               On CDbl(e1.EntObj.X2) Equals CDbl(e2.EntObj.X1) _
                               And CDbl(e1.EntObj.Y2) Equals CDbl(e2.EntObj.Y1)

2 个答案:

答案 0 :(得分:1)

无密钥属性 的匿名类型实例仅为Equal

请参阅:MSDN article on Anonymous Types, Header - Key Properties, Equality

要使第一个查询与第二个查询相同,您需要更改第一个代码示例以将X和Y属性标记为关键属性:

Dim LTest2 As IEnumerable = From e1 As QNCEntity In Shape.Entities _
                        Join e2 As QNCEntity In Shape.Entities _
                        On New With { _
                                      Key .X = CDbl(e1.EntObj.X2), _
                                      Key .Y = CDbl(e1.EntObj.Y2) _
                                    } _
                        Equals New With { _
                                          Key .X = CDbl(e2.EntObj.X1), _
                                          Key .Y = CDbl(e2.EntObj.Y1) _
                                        }

关键字段将按等值测试的值进行比较,而不是比较两个匿名类型的引用。

答案 1 :(得分:0)

Width是一类吗?是?在这种情况下,第一个查询将通过引用比较对象,而第二个查询将比较实际值。 (...和参考文献 - 当然 - 永远不会匹配,因为你总是创建一个新实例。)