VB.Net与c#表达式树的区别

本文关键字:区别 表达式 Net VB | 更新日期: 2023-09-27 18:10:22

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

[TableName("Orders")]
public class Order : EntityBase<int>
{
    public int OrderID;
    public DateTime? OrderDate;
}
c# linq代码是:
from ord in Order
where ord.OrderDate == new DateTime(1997, 11, 14)
select ord.OrderID

VB的linq代码是:

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
}

和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) ?? False
}
.Lambda #Lambda2<System.Func`2[Data.Linq.Model.Northwind+Order,System.Int32]>(Data.Linq.Model.Northwind+Order $order) {
    $order.OrderID
}

为什么VB坚持?? False到OrderDate比较的结束,这有什么意义?

BLToolkit相关问题报告

VB.Net与c#表达式树的区别

VB。NET处理可空类型与c#和VB有点不同。. NET可以向后兼容VB6。

一个c#空值为Null是一个实际的Null,并且在LINQ中转换为SQL。

一个VB空值是Nothing有一个内部定义的默认值,因为VB6没有一个真正的"NULL"值。可空字段的属性"。如果内部值是这个默认值,则Value"返回none,而LINQ直接使用内部值。

" ? ?False"是LINQ处理这个"不是真正的Null"属性的方式,所以当使用可空类型时,LINQ对对象不会抛出合适的错误。这不会被翻译成SQL。

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

的例子:

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

Dim result = From row In Table _
             Where row.nullableField IsNot Nothing AndAlso row.nullableField = anotherValue _
             Select row