Kay*_*yot 6 linq vb.net lambda entity-framework-6
当我开始使用Entity Framework时,我使用了查询语法,因为我更习惯使用SQL而不是使用方法.现在我了解了如何使用Method,所以我将一些旧的LINQ Query转换为Method,因为我发现Method从编程角度来看更有意义.
我的问题是,为什么编译器要我在某些项目周围使用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)
Run Code Online (Sandbox Code Playgroud)
变成了这个
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)
Run Code Online (Sandbox Code Playgroud)
但在c#中这很好用
TotalYearWages == DB.interview_earnings
.Where(t => t.IID == Input.ID && t.EarningsYear == Input.EarningsYear)
.Select(t => t.Amount).Sum() ?? 0
Run Code Online (Sandbox Code Playgroud)
我的问题;
为什么我必须围绕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
Run Code Online (Sandbox Code Playgroud)
班级建设者是;
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
Run Code Online (Sandbox Code Playgroud)
和
输入是
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
Run Code Online (Sandbox Code Playgroud)
当您需要可为 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)
Run Code Online (Sandbox Code Playgroud)
如果符合逻辑,我建议您在数据库中将这两个字段设置为相同类型。
而且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)
Run Code Online (Sandbox Code Playgroud)