在LINQ查询中检查十进制是否为NULL

本文关键字:是否 NULL 十进制 检查 LINQ 查询 | 更新日期: 2023-09-27 18:09:33

在我的LINQ查询的分配部分,我需要检查值是否为空,并分配一个默认值,如果它是。返回的值类型是十进制当与null比较时,会得到警告

表达式的结果总是'false',因为'decimal'类型的值永远不等于'decimal'类型的'null'。'

如果我试着比较它的值是否为0那么我就会得到错误

转换为值类型'System '。Decimal'失败,因为物化值为空。结果类型的泛型参数或查询必须使用可空类型。

检查HoursWorked2是否为null并为其分配默认值的最佳方法是什么?

编辑:我不认为所有的代码都需要,但由于其他人认为这是需要的,这里是所有相关的代码:

    // AJAX: /TimeOverviewGrid
    [Route("TimeOverviewGrid", Name = "Time Overview Grid")]
    public ActionResult TimeOverviewGrid()
    {
        var PayPeriod = TimeCardHelper.GetCurrentPayPeriod();
        var WeekBeforePayPeriod = PayPeriod.AddDays(-7);
        try
        {
            var EmployeeID = EmployeeHelper.GetEmployeeID(User.Identity.Name);
            using (var db = new JobSightDbContext())
            {
                var TimeOverviewData = (from th1 in db.TimeCardHeaders
                                        join e in db.Employees on th1.EmployeeID equals e.ID
                                        join so1 in db.StatusOptions on th1.CurrentStatusID equals so1.ID
                                        join leftth2 in db.TimeCardHeaders.Where(timeCardHeader => timeCardHeader.WeekEndingDate == PayPeriod)
                                        on th1.EmployeeID equals leftth2.EmployeeID into leftjointh2
                                        from th2 in leftjointh2.DefaultIfEmpty()
                                        join so2 in db.StatusOptions on th2.CurrentStatusID equals so2.ID into leftjoinso2
                                        from th2Final in leftjoinso2.DefaultIfEmpty()
                                        where th1.WeekEndingDate == WeekBeforePayPeriod && (e.ID == EmployeeID || e.ManagerID == EmployeeID)
                                        orderby e.FirstName
                                        select new DashboardTimeOverviewVM()
                                        {
                                            EmployeeID = e.ID,
                                            Employee = string.Concat(e.FirstName, " ", e.LastName),
                                            WeekOfDate1 = th1.WeekEndingDate,
                                            HoursWorked1 = th1.TotalHoursWorked,
                                            Status1 = so1.Name,
                                            WeekOfDate2 = (th2.WeekEndingDate == null) ? PayPeriod : th2.WeekEndingDate,
                                            HoursWorked2 = (th2.TotalHoursWorked == null) ? 0 : th2.TotalHoursWorked,
                                            Status2 = (string.IsNullOrEmpty(th2Final.Name)) ? "New" : th2Final.Name,
                                            PTO = e.PTORemaining
                                        }).ToList();
                return Json(TimeOverviewData, JsonRequestBehavior.AllowGet);
            }
        }
        catch (Exception ex)
        {
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json(new { responseText = "Error getting data, please try again later" }, JsonRequestBehavior.AllowGet);
        }
    }
    public static DateTime GetCurrentPayPeriod()
    {
        var KnownPayPeriodDate = DateTime.Parse("2007-11-10");
        while (KnownPayPeriodDate.CompareTo(DateTime.Today) < 0)
        {
            KnownPayPeriodDate = KnownPayPeriodDate.AddDays(14);
        }
        return ((KnownPayPeriodDate - DateTime.Today).Days < 7) ? KnownPayPeriodDate : KnownPayPeriodDate.AddDays(-14);
    }
    public static int GetEmployeeID(string adUserName)
    {
        adUserName = adUserName.Remove(0, 9);
        using (var db = new JobSightDbContext())
        {
            return db.Employees.Where(employee => employee.ADUserName == adUserName).Select(employee => employee.ID).First();
        }
    }
public class DashboardTimeOverviewVM
{
    public int EmployeeID { get; set; }
    public string Employee { get; set; }
    public DateTime WeekOfDate1 { get; set; }
    public decimal HoursWorked1 { get; set; }
    public string Status1 { get; set; }
    public DateTime WeekOfDate2 { get; set; }
    public decimal HoursWorked2 { get; set; }
    public string Status2 { get; set; }
    public decimal PTO { get; set; }
}
public class TimeCardHeader
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public int EmployeeID { get; set; }
    public DateTime WeekEndingDate { get; set; }
    public decimal TotalHoursWorked { get; set; }
    public int CurrentStatusID { get; set; }
    public decimal OtherPay { get; set; }
    public int? ApprovedByID { get; set; }
    public DateTime? DateSubmitted { get; set; }
    public DateTime? DateApproved { get; set; }
    [Column(TypeName = "varchar(MAX)")]
    public string ManagerNotes { get; set; }
    [ForeignKey("EmployeeID")]
    public Employee Employee { get; set; }
    [ForeignKey("ApprovedByID")]
    public Employee ApprovedBy { get; set; }
    [ForeignKey("CurrentStatusID")]
    public StatusOption CurrentStatus { get; set; }
}
public class Employee
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string ADUserName { get; set; }
    [Required]
    public string Email { get; set; }
    public int? ManagerID { get; set; }
    [Required]
    public string EmploymentType { get; set; }
    [Required]
    public string PhoneNumber { get; set; }
    [Required]
    public string OfficeLocation { get; set; }
    public string MobilePhoneNumber { get; set; }
    public decimal PTORemaining { get; set; }
    public decimal PTOAccrualRate { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int ADPFileNumber { get; set; }
    public int AirCardLateCheckinCount { get; set; }
    public int VehicleLateCheckinCount { get; set; }
    public int WexCardDriverID { get; set; }
    public int? UpdatedByEmployeeID { get; set; }
    public DateTime? DateUpdated { get; set; }
    [ForeignKey("ManagerID")]
    public Employee Manager { get; set; }
    [ForeignKey("UpdatedByEmployeeID")]
    public Employee UpdatedBy { get; set; }
}
public class StatusOption
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
}

在LINQ查询中检查十进制是否为NULL

由于您的th2变量来自left outer join,相应的字段是非空类型(如您的decimal),最简单(和正确)的方法是对th2执行null检查:

HoursWorked2 = th2 == null ? 0 : th2.TotalHoursWorked

另一种仅适用于LINQ to Entities的方法(并将在LINQ to Objects中生成NullReferenceException)是使用转换为可空类型:

HoursWorked2 = (decimal?)th2.TotalHoursWorked ?? 0

Decimal是value type,所以不能是Null

你的选择:

  1. TotalHoursWorked重新定义为decimal? - Nullable value type,然后可以比较null的值

  2. 否则,将0设置为0.0M,以便在运行时将其与decimal类型进行比较,否则将与integer值进行比较