Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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
VB.Net与C#表达式树的差异_C#_Vb.net_Linq - Fatal编程技术网

VB.Net与C#表达式树的差异

VB.Net与C#表达式树的差异,c#,vb.net,linq,C#,Vb.net,Linq,我有一个LINQ查询,它在C#和VB.net中的文本非常相似。我正在尝试使用从Northwind数据库加载所有订单。这是我的订单课。请注意,OrderDate DateTime是可为空的DateTime [TableName("Orders")] public class Order : EntityBase<int> { public int OrderID; public DateTime? OrderDate; } VB linq代码为: from ord i

我有一个LINQ查询,它在C#和VB.net中的文本非常相似。我正在尝试使用从Northwind数据库加载所有订单。这是我的订单课。请注意,OrderDate DateTime是可为空的DateTime

[TableName("Orders")]
public class Order : EntityBase<int>
{
    public int OrderID;
    public DateTime? OrderDate;
}
VB linq代码为:

from ord in Order
where ord.OrderDate == new DateTime(1997, 11, 14)
select ord.OrderID
From order In db.Order _
Where order.OrderDate = #11/14/1997#
Select order.OrderID
执行时,C#代码生成以下表达式树:

.Call System.Linq.Queryable.Select(
    .Call System.Linq.Queryable.Where(
        .Constant<BLToolkit.Data.Linq.Table`1[Data.Linq.Model.Northwind+Order]>(Table(Order)),
        '(.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>)),
    '(.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>))

.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderDate == (System.Nullable`1[System.DateTime]).New System.DateTime(
        1997,
        11,
        14)
}

.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderID
}
.Call System.Linq.Queryable.Select(
    .Call System.Linq.Queryable.Where(
        .Constant<BLToolkit.Data.Linq.Table`1[Data.Linq.Model.Northwind+Order]>(Table(Order)),
        '(.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>)),
    '(.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>))

.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderDate == (System.Nullable`1[System.DateTime]).New System.DateTime(
        1997,
        11,
        14) ?? False
}

.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderID
}
.Call System.Linq.Queryable.Select(
.Call System.Linq.Queryable.Where(
.常数(表(顺序)),
"(Lambda#Lambda1),,
“(.Lambda#Lambda2))
.Lambda#Lambda1(Data.Linq.Model.Northwind+订单$Order){
$order.OrderDate==(System.Nullable`1[System.DateTime])。新建System.DateTime(
1997,
11,
14)
}
.Lambda#Lambda2(Data.Linq.Model.Northwind+订单$Order){
$order.OrderID
}
VB代码生成这个表达式树:

.Call System.Linq.Queryable.Select(
    .Call System.Linq.Queryable.Where(
        .Constant<BLToolkit.Data.Linq.Table`1[Data.Linq.Model.Northwind+Order]>(Table(Order)),
        '(.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>)),
    '(.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>))

.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderDate == (System.Nullable`1[System.DateTime]).New System.DateTime(
        1997,
        11,
        14)
}

.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderID
}
.Call System.Linq.Queryable.Select(
    .Call System.Linq.Queryable.Where(
        .Constant<BLToolkit.Data.Linq.Table`1[Data.Linq.Model.Northwind+Order]>(Table(Order)),
        '(.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>)),
    '(.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>))

.Lambda #Lambda1<System.Func`2[Data.Linq.Model.Northwind+Order,System.Boolean]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderDate == (System.Nullable`1[System.DateTime]).New System.DateTime(
        1997,
        11,
        14) ?? False
}

.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderID
}
.Call System.Linq.Queryable.Select(
.Call System.Linq.Queryable.Where(
.常数(表(顺序)),
"(Lambda#Lambda1),,
“(.Lambda#Lambda2))
.Lambda#Lambda1(Data.Linq.Model.Northwind+订单$Order){
$order.OrderDate==(System.Nullable`1[System.DateTime])。新建System.DateTime(
1997,
11,
14) ??错误
}
.Lambda#Lambda2(Data.Linq.Model.Northwind+订单$Order){
$order.OrderID
}
为什么VB坚持使用
??False
到OrderDate比较的末尾,这有什么意义


VB.NET处理的可空类型与C#稍有不同,因此VB.NET可以向后兼容VB6

一个C#nullable为Null就是一个实际的Null,并且在LINQ中转换为SQL

由于VB6没有真正的“NULL”值,因此可为空的VB具有内部定义的默认值。如果内部值是此默认值,则可空字段的属性“.Value”不返回任何内容,而LINQ直接使用内部值

“??False”是LINQ处理这个“并非真正为Null”属性的方法,因此LINQto对象在使用可为Null的类型时不会抛出合适的结果。这不会转换为SQL

在使用可空类型的VB LINQ to SQL查询中,必须将常规Where子句与“IsNot Nothing”或“field.HasValue”检查配对。这避免了LINQ隐式地创建“IsThisNull”检查

例如:

Dim result = From row In Table _
             Where row.nullableField.HasValue AndAlso row.nullableField = someValue _
             Select row


VB.NET处理的可空类型与C#稍有不同,因此VB.NET可以向后兼容VB6

一个C#nullable为Null就是一个实际的Null,并且在LINQ中转换为SQL

由于VB6没有真正的“NULL”值,因此可为空的VB具有内部定义的默认值。如果内部值是此默认值,则可空字段的属性“.Value”不返回任何内容,而LINQ直接使用内部值

“??False”是LINQ处理这个“并非真正为Null”属性的方法,因此LINQto对象在使用可为Null的类型时不会抛出合适的结果。这不会转换为SQL

在使用可空类型的VB LINQ to SQL查询中,必须将常规Where子句与“IsNot Nothing”或“field.HasValue”检查配对。这避免了LINQ隐式地创建“IsThisNull”检查

例如:

Dim result = From row In Table _
             Where row.nullableField.HasValue AndAlso row.nullableField = someValue _
             Select row


出于好奇,为什么?您是否对一个工作而不是另一个有问题?是的,BLToolkit是一个ORM,它将LINQ查询转换为SQL查询。它没有处理
??False
VB正在插入。您在VB版本中尝试过
新日期时间(…)
吗?是的,它生成了一个非常相似的表达式树,仍然包含
??错误
。出于好奇,为什么?您是否对一个工作而不是另一个有问题?是的,BLToolkit是一个ORM,它将LINQ查询转换为SQL查询。它没有处理
??False
VB正在插入。您在VB版本中尝试过
新日期时间(…)
吗?是的,它生成了一个非常相似的表达式树,仍然包含
??False
。太棒了,这正是我需要知道的。在LINQtoSQL中,它不会被转换成最终的SQL,但是我正在处理一个非MS、开源ORM、BLToolkit。看起来问题在于他们没有处理VB奇怪的可空处理。积分给你!太棒了,这正是我想知道的。在LINQtoSQL中,它不会被转换成最终的SQL,但是我正在处理一个非MS、开源ORM、BLToolkit。看起来问题在于他们没有处理VB奇怪的可空处理。积分给你!