我正在尝试关注这一系列文章。我在第 2 部分和第 3 部分之间,但遇到了一些问题。
我正在 VB.Net 中编写代码,这引发了一些怪癖。
具体来说,在访问表达式树时,字符串比较没有按预期工作。
QueryProvider 中的这个方法(第 2 部分)
Protected Overrides Function VisitMethodCall(m As MethodCallExpression) As Expression
If m.Method.DeclaringType = GetType(Queryable) AndAlso m.Method.Name = "Where" Then
sb.Append("SELECT * FROM (")
Me.Visit(m.Arguments(0))
sb.Append(") AS T WHERE ")
Dim lambda As LambdaExpression = DirectCast(StripQuotes(m.Arguments(1)), LambdaExpression)
Me.Visit(lambda.Body)
Return m
End If
Throw New NotSupportedException(String.Format("The method '{0}' is not supported", m.Method.Name))
End Function
为字符串比较抛出 NotImplementedException
m.Method.DeclaringType
是 类型Microsoft.VisualBasic.CompilerServices.Operators
并且 m.Method.Name
是CompareString
。看起来 VB 对字符串相等的处理方式略有不同,并且没有以正确的方式进行处理。
我正在使用 aQuery.Where(function(x) x.Content_Type <> "")
进行测试。
VisitBinary(b As BinaryExpression)
具体来说,如果我调试对(也是第 2 部分)的调用,b
是{(CompareString(x.Content_Type, "", False) != 0)}
然后,它会尝试访问b.Left
( CompareString(x.Content_Type, "", False)
),这是我们从 . 中的洞落入的地方VisitMethodCall
。
如果我只是将 VisitMethodCall 中的 If 展开为
If (
m.Method.DeclaringType = GetType(Queryable) AndAlso
m.Method.Name = "Where"
) Or (
m.Method.DeclaringType = GetType(Microsoft.VisualBasic.CompilerServices.Operators) AndAlso
m.Method.Name = "CompareString") Then
它在尝试将其转换为时抛出 InvalidCastException StripQuotes(m.Arguments(1))
(LambdaExpression
说它是 a ConstantExpression
)
我需要做什么才能从 VB 中正确处理字符串比较?