vb.net - LINQ 查询到 LINQ 方法;为什么我需要CBool​​?

标签 vb.net linq lambda entity-framework-6

当我开始使用 Entity Framework 时,我使用了查询语法,因为我更习惯于使用 SQL 而不是方法。现在我明白了如何使用 Method,所以我将一些旧的 LINQ 查询转换为 Method,因为我发现 Method 从编程的角度来看更有意义。

我的问题是,为什么编译器要我在某些 where 项目周围使用 CBool​​() 而不是其他项目?它不在 C# 中执行此操作,仅在 VB 中执行。

例子;

这个

TotalYearWages = If((From t In DB.interview_earnings
    Where t.IID = Input.ID AndAlso  t.EarningsYear = Input.EarningsYear
    Select t.Amount).Sum, 0)

变成这个
TotalYearWages = If(DB.interview_earnings.
    Where(Function(t) t.IID = Input.ID AndAlso CBool(t.EarningsYear = Input.EarningsYear)).
    Select(Function(t) t.Amount).Sum(), 0)

但是在 c# 中这很好用
TotalYearWages == DB.interview_earnings
    .Where(t => t.IID == Input.ID && t.EarningsYear == Input.EarningsYear)
    .Select(t => t.Amount).Sum() ?? 0

我的问题;

为什么我必须在 where 子句的某些部分周围使用 CBool​​ 而不是在其他部分周围?什么决定了需求?

编辑;

我在没有 CBool​​ 的情况下得到的错误是;
Severity    Code    Description Project File    Line    Suppression State
Error   BC30512 Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.   WOTC-FE d:\Programming\WOTC-Projects\WOTC-FE\Class\Billing.vb   129 Active

类构造函数是;
Imports System
Imports System.Collections.Generic

Partial Public Class interview_earnings
    Public Property ID As Integer
    Public Property IID As Integer
    Public Property CLIENTCODE As String
    Public Property ClientLocation As String
    Public Property EarningsDate As Nullable(Of Date)
    Public Property UserName As String
    Public Property Amount As Nullable(Of Decimal)
    Public Property Hours As Nullable(Of Decimal)
    Public Property InvDate As Nullable(Of Date)
    Public Property InvNumber As Nullable(Of Short)
    Public Property Notes As String
    Public Property EarningsYear As Nullable(Of Short)
    Public Property TCPercent As Nullable(Of Byte)
    Public Property WTWBill As Nullable(Of Boolean)
    Public Property WTW2yrBill As Nullable(Of Boolean)
    Public Property Refund As Nullable(Of Boolean)

    Public Overridable Property interview_main As interview_main

End Class



输入是
Public Class WageInfo
    Public Property ID As Integer
    Public Property NewYTDWage As Decimal?
    Public Property Limit As Integer?
    Public Property WOTC As Boolean
    Public Property EarningsRemaining As Decimal?
    Public Property EarningsYear As Short
    Public Property ThirdYearCalculation As Boolean
    Public Property WTW2Base As Decimal?
    Public Property WageWTW2Yr As Decimal?
    Public Property WageWOTC As Decimal?
    Public Property StartDate As Date?
    Public Property EarningsDate As Date
End Class

最佳答案

当您需要可空变量的基础值时,请使用 Value 方法。这适用于 vb.net 和 c#。

TotalYearWages = If(DB.interview_earnings.
    Where(Function(t) t.IID = Input.ID AndAlso t.EarningsYear.Value = Input.EarningsYear).
    Select(Function(t) t.Amount).Sum(), 0)

如果合乎逻辑,我建议您在数据库中将这两个字段设为相同类型。

而 c# 和 vb.net 编译器是不同的。 Option Strict On不会使 vb.net 的行为与 c# 完全相同。

编辑:

此解决方案将处理 Interview_earnings.EarningsYear 中的 NULL
TotalYearWages = If(DB.interview_earnings.
    Where(Function(t) t.IID = Input.ID AndAlso t.EarningsYear.Equals(Input.EarningsYear)).
    Select(Function(t) t.Amount).Sum(), 0)

关于vb.net - LINQ 查询到 LINQ 方法;为什么我需要CBool​​?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50511108/

相关文章:

c# - Excel 互操作 : Quitting the Excel application instance makes my tests fail?

c# - 如何在 vb.net 中实现值类型的 C# 'as' 关键字?

linq - 帮助将 foreach 转换为 Linq

c# - 学习新技术的最佳方法是什么?

c# - 我无法理解 GroupJoin 在数据库关系中需要它的地方

c# - 请解释一下 .NET 4.0 中的 Func 委托(delegate)

javascript - JScript 参数集合 - .Net 等效项

vb.net - 在一个处理程序中处理所有事件?

c++ - Qt 连接 Lambda 不工作

java - 为什么 CompletableFuture.supplyAsync 会成功随机次数?