LINQ和VB.NET以及编译的表达式树正在破坏亚音速3
我一直在尝试用VB.NET和它喜欢生成的表达式树来解决一个小问题 我有一个简单的测试LINQ和VB.NET以及编译的表达式树正在破坏亚音速3,vb.net,linq,subsonic,subsonic3,expression-trees,Vb.net,Linq,Subsonic,Subsonic3,Expression Trees,我一直在尝试用VB.NET和它喜欢生成的表达式树来解决一个小问题 我有一个简单的测试 Public Sub ActiveRecord_Find_By_NonKey_Returns_123() Dim orders = Order.Find(Function(item As Order) item.EmployeeID = 1) Assert.Equal(Of Integer)(123, orders.Count) End Sub 人们可能认为这是可行的,但是item.Employ
Public Sub ActiveRecord_Find_By_NonKey_Returns_123()
Dim orders = Order.Find(Function(item As Order) item.EmployeeID = 1)
Assert.Equal(Of Integer)(123, orders.Count)
End Sub
人们可能认为这是可行的,但是item.EmployeeID=1
位有问题,这只是VB.NET的问题,而不是C#的问题。VB.NET喜欢巧妙地使用它编译的表达式树,因为项是可以为空的!()
问题在于expressionitem.EmployeeID=1
使用Convert
expression节点获取包装。此时TSql生成器将完全丢失并创建以下WHERE
子句
WHERE ([t0].[EmployeeID] = 1) <> 0
但是它的WHERE
子句是
WHERE COALESCE(CASE WHEN (([t0].[EmployeeID] = 1)) THEN 1 ELSE 0 END, 0) <> 0
这将生成此WHERE
子句
WHERE (COALESCE([t0].[EmployeeID], 0) = 1)
一个更简洁的查询,尽管它与使用ISNULL
和COALESCE
有区别吗?可能只是在SQL版本之间的兼容性方面
基本上,我希望第一个示例能够正常工作。我还希望第二个示例继续工作,但生成更干净的SQL
我很想自己解决这个问题,但没走多远就意识到我在VB.NET表达式树生成方面有一些问题
Public Sub ActiveRecord_Find_By_NonKey_Returns_123_Fix()
Dim orders = Order.Find(Function(item As Order) If(item.EmployeeID, 0) = 1)
Assert.Equal(Of Integer)(123, orders.Count)
End Sub
WHERE (COALESCE([t0].[EmployeeID], 0) = 1)