Ref*_*din 1 .net c# linq linq-to-sql
我想在下面返回一个Guid值.但是,数据库(和我的dbml)将该列作为a nullable Guid并且它在.Select部分上生成异常,表示它无法从IQueryable<System.Guid?>a 转换为a System.Guid.
我猜我需要先让我的返回值" 具体 "???? 真正?
如果是这样,我如何用Guid做到这一点?
public static Guid GetCurrentWorkerByType(int enrollmentID, int staffTypeID)
{
using (var context = CmoDataContext.Create())
{
IQueryable<tblWorkerHistory> tWorkHist = context.GetTable<tblWorkerHistory>();
return (tWorkHist.Where(workHist =>
(workHist.EnrollmentID == enrollmentID) &&
(workHist.tblStaff.StaffTypeID == staffTypeID) &&
(workHist.EndDate == null || workHist.EndDate > DateTime.Now))
.Select(workHist => workHist.Worker));
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
// Get the Guid? itself, for sake of example from IQueryable<Guid?>
// (could be `null` from DB value or because queryable was empty)
Guid? maybeGuid = queryable.FirstOrDefault();
// Need to have *a* GUID or default it to something
// because a Guid is a value-type and needs *a* value.
Guid theGuid = maybeGuid ?? Guid.Empty;
Run Code Online (Sandbox Code Playgroud)
另见Nullable<T>.HasValue/Value- 更长但相当的方法是:
Guid theGuid = maybeGuid.HasValue ? maybeGuid.Value : Guid.Empty;
Run Code Online (Sandbox Code Playgroud)
观察HasValue可能适用于if更改逻辑的一般语句,并注意Value如果maybeGuid"没有价值"则会抛出异常 - 是null- 这就是为什么要求守卫的原因.
快乐的编码.
迂腐细节:等效方法不是"线程安全".也就是说,假设maybeGuid是共享的,它可以null在HasValue和之间分配Value.有许多SO问题涵盖??(coalesce运算符)的"线程安全性" - 生成的IL有效地使用临时变量,因此值可能是陈旧的但不能抛出异常.