LINQ Query to LINQ Method;为什么我需要 CBool?



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

我的问题是,为什么编译器希望我在某个 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:ProgrammingWOTC-ProjectsWOTC-FEClassBilling.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

如果需要可为 null 的变量的基础值,请使用 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 中的 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)

最新更新