gpt4 book ai didi

c# - 在 LINQ 查询中检查 NULL 的小数

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:14 26 4
gpt4 key购买 nike

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

The result of the expression is always 'false' since a value of type 'decimal' is never equal to 'null' of type 'decimal?'

如果我尝试比较它以查看该值是否为 0,则会出现错误

The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

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

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

    // 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; }
}

最佳答案

由于您的 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

关于c# - 在 LINQ 查询中检查 NULL 的小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com