我试图在下面返回一个 Guid 值。但是数据库(和我的 dbml)将该列作为 nullable Guid
并且它在 .Select
上生成异常部分说它不能从 IQueryable<System.Guid?>
转换到 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));
}
}
}
最佳答案
// 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;
另见 Nullable<T>.HasValue/Value
-- 一个更长但等效的方法是:
Guid theGuid = maybeGuid.HasValue ? maybeGuid.Value : Guid.Empty;
观察 HasValue
一般可能合适if
更改逻辑的语句并注意 Value
如果 maybeGuid 是“没有值(value)”,将抛出异常——是 null
-- 这就是为什么需要守卫的原因。
快乐编码。
迂腐的细节:等效方法不是“线程安全的”。也就是说,假设 maybeGuid
已共享,可以分配null
在 HasValue
之间和 Value
.有许多 SO 问题涵盖了 ??
的“线程安全” (合并运算符)——生成的 IL 有效地使用了一个临时变量,因此该值可能已过时但不会抛出异常。
关于c# - 如何从 'Guid' 返回 'Nullable<Guid>' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5668673/