我有一个名为Employee的表。表中的一些字段是CompanyId,SomeData
我想根据companyId查询Min SomeDate。
这样的事情:
public DateTime? GetMinDateForCompany(long CompanyId)
{
dataContext.Employees.Where(emp => emp.CompanyID == companyId).Select(emp => emp.SomeDate).Min();
}
如果没有匹配的companyId,它会抛出异常。是否有可能返回null。通常,当为LINQ-to-SQL查询返回null时。
答案 0 :(得分:2)
您应该调用Any()方法以确保您有结果。否则,你将在没有结果的情况下调用Min(),这将引发错误。
public DateTime GetMinPayrollDateForCompany(long CompanyId)
{
if (dataContext.Payrolls.Any(proll => proll.CompanyID == companyId))
return dataContext.Payrolls.Where(proll => proll.CompanyID == companyId).Select(proll => proll.PayrollDate).Min();
else
return new DateTime();
}
要回答您的问题,我确实认为对companyId没有结果的查询会抛出错误。 Any()方法将是你的朋友。在空集上调用其他方法会抛出错误。
答案 1 :(得分:0)
Min
将在SQL中返回NULL
。这是预料之中的。当您投射结果时,问题出现在C#中。如果类型不可为空,您将收到如下错误:
The null value cannot be assigned to a member with type System.DateTime which is a non-nullable value type.
这是因为C#将返回类型基于您要求Min
的字段,在本例中为DateTime
(这是泛型的工作原理)。但是,我们可以通过简单地将结果类型转换为类型的可空版本来避免此错误!
您的原始查询将更改为以下内容:
dataContext.Payrolls
.Where(proll => proll.CompanyID == companyId)
.Min(proll => (DateTime?)proll.PayrollDate)
这将产生NULL
结果,而不是抛出异常。 IIRC,如果您的原始类型已经可以为空,则不需要进行类型转换。