在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; }
}
由于您的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
你的选择:
-
将
TotalHoursWorked
重新定义为decimal?
-Nullable value type
,然后可以比较null
的值 -
否则,将
0
设置为0.0M
,以便在运行时将其与decimal
类型进行比较,否则将与integer
值进行比较