Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ和VB.NET以及编译的表达式树正在破坏亚音速3_Vb.net_Linq_Subsonic_Subsonic3_Expression Trees - Fatal编程技术网

LINQ和VB.NET以及编译的表达式树正在破坏亚音速3

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

我一直在尝试用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.EmployeeID=1
位有问题,这只是VB.NET的问题,而不是C#的问题。VB.NET喜欢巧妙地使用它编译的表达式树,因为
项是可以为空的!()

问题在于expression
item.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)