我需要帮助在VB.NET下使用LINQ表达式。
我有一个包含3个字段的类,我想找到COMBINED 3字段的MIN和MAX(想想SQL UNION)。我已经能够建立一个LINQ表达式,将所有3(十进制)字段放入1(十进制)字段......并且#34;应该"就像在表达式末尾指定.Min或.Max属性一样简单......但是,它一直为我抛出一个错误...所以,寻找一些帮助。
这是VB.NET中的LINQ表达式,它返回UNION< d列/字段的LIST ......
Dim result As List(Of RValue) = MeterRoughnessMaster_R1.[Select](Function(x) New RValue() With { _
.RValue = x.RValueBOTH _
}).Union(MeterRoughnessMaster_R1.[Select](Function(x) New RValue() With { _
.RValue = x.RValueUP _
}).Union(MeterRoughnessMaster_R1.[Select](Function(x) New RValue() With { _
.RValue = x.RValueDN _
}))).ToList
以上需要重新进行,以便"结果"应该保持十进制值或MIN或MAX。
我试过了......
Dim result = MeterRoughnessMaster_R1.[Select](Function(x) New With { _
.RValue = x.RValueBOTH _
}).Union(MeterRoughnessMaster_R1.[Select](Function(x) New With { _
.RValue = x.RValueUP _
}).Union(MeterRoughnessMaster_R1.[Select](Function(x) New With { _
.RValue = x.RValueDN _
}))).Min
但它错误" d"至少有一个对象必须实现IComparable。"所以,我错过了一个关键字,否则会调用IComparable(这就是我想的.Min会做的)
我希望上面的LINQ表达式能够简单地将.Min(或.Max)返回到变量" result" (十进制)。 " RValue"如果需要,可以放弃课程......但是来自" MeterRoughnessMaster_R1"必须保持。我想在LINQ(VB.NET)中执行此操作。
答案 0 :(得分:1)
没有必要精心设计Union
。您应该使用SelectMany
。
Dim allValues = MeterRoughnessMaster_R1.SelectMany(Function(x) {x.RValueBOTH, x.RValueUP, x.RValueDN}).ToArray()
Dim min = allValues.Min()
Dim max = allValues.Max()
显然,您不必使用allValues
变量,并且可以在一个语句中获得最小值或最大值,但如果您想要两者,则应使用变量。
编辑:我还应该注意,如果您使用单个语句来获得最小值或仅获得最大值,那么您也可以放弃ToArray
调用。
Dim min = MeterRoughnessMaster_R1.SelectMany(Function(x) {x.RValueBOTH, x.RValueUP, x.RValueDN}).Min()
Dim max = MeterRoughnessMaster_R1.SelectMany(Function(x) {x.RValueBOTH, x.RValueUP, x.RValueDN}).Max()