嗯,我个人所做的是构建 lambda 表达式,然后将最终表达式应用于列表。
我对 Linq.Expression 使用了一些扩展方法,它只包含如下内容:
<System.Runtime.CompilerServices.Extension()> _
Public Function Compose(Of T)(ByVal first As Expressions.Expression(Of T), ByVal second As Expressions.Expression(Of T), ByVal merge As Func(Of Expressions.Expression, Expressions.Expression, Expressions.Expression)) As Expressions.Expression(Of T)
'' build parameter map (from parameters of second to parameters of first)
Dim map = first.Parameters.[Select](Function(f, i) New With {f, .s = second.Parameters(i)}).ToDictionary(Function(p) p.s, Function(p) p.f)
'' replace parameters in the second lambda expression with parameters from the first
Dim secondBody = ParameterRebinder.ReplaceParameters(map, second.Body)
'' applycomposition of lambda expression bodies to parameters from the first expression
Return Expressions.Expression.Lambda(Of T)(merge(first.Body, secondBody), first.Parameters)
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function [And](Of T)(ByVal first As Expressions.Expression(Of Func(Of T, Boolean)), ByVal second As Expressions.Expression(Of Func(Of T, Boolean))) As Expressions.Expression(Of Func(Of T, Boolean))
Return first.Compose(second, AddressOf Expressions.Expression.And)
End Function
然后你可以像这样构建查询:
Dim MyQuery as Linq.Expressions.Expression(Of System.Func(Of MyListDataType, Boolean))
Dim MyGroupingExpression as Linq.Expressions.Expression(Of System.Func(Of MyListDataType, Boolean))
Dim MyQuery = Function(x) x.SomeValue = SomeExpectedValue
Select case SomeOtherVariable
Case Option1
Dim MyGroupingExpression = <blah>
Case Option2
Dim MyGroupingExpression = <blah>
End Select
Dim Results = MyList.Where(MyQuery.And(GroupingExpression))
这就是你所追求的吗?