如何从'Nullable <Guid>'返回'Guid'?

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有效地使用临时变量,因此值可能是陈旧的但不能抛出异常.