LINQ Query to LINQ Method;Зачем мне CBool? - PullRequest
0 голосов
/ 24 мая 2018

Когда я начал использовать Entity Framework, я использовал синтаксис запроса, поскольку я больше привык к использованию SQL, чем к Method.Теперь я понимаю, как использовать метод, поэтому я конвертирую некоторые из моих старых запросов LINQ в метод, так как я обнаружил, что метод имеет больше смысла с точки зрения программирования.

Мой вопрос: почему компилятор хочет, чтобы яиспользовать CBool ​​() для некоторых предметов, но не для других?Это не делает это в C #, только VB.

Пример;

This

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

Мой вопрос;

Почему я должен использовать CBool ​​вокруг некоторых частей предложения where, но не вокруг других?От чего зависит необходимость?

Редактировать;

Ошибка, которую я получаю без 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

1 Ответ

0 голосов
/ 24 мая 2018

Если вы хотите получить базовое значение переменной, допускающей значение 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 #.

Редактировать:

Это решение будет обрабатывать значения NULL в survey_earnings.EarningsYear

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...