c# - 如何从 'Guid' 返回 'Nullable<Guid>' ?

标签 c# .net linq linq-to-sql

我试图在下面返回一个 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已共享,可以分配nullHasValue 之间和 Value .有许多 SO 问题涵盖了 ?? 的“线程安全” (合并运算符)——生成的 IL 有效地使用了一个临时变量,因此该值可能已过时但不会抛出异常。

关于c# - 如何从 'Guid' 返回 'Nullable<Guid>' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5668673/

相关文章:

c# - Grid.Row 和类似属性如何获得如此出色的 DESIGN TIME 支持?

c# - 在 LINQ 查询期间提供用户反馈

c# - 从 OData 返回单个实体 - .Net

c# - 无法在 DropDownButton 中组织数据

作为嵌入式资源的 C# View 在构建后始终显示旧 View

c# - 在不牺牲索引使用的情况下转义 SQLite LIKE 中的通配符 (%, _)?

c# - 获取特定文化的 DateTime.DayOfWeek

c# - 如果 struct 不可为空,则在 C# 中检查 struct 是否为 null

c# - 如何在 Linq 和 EF 中订购嵌套集合

c# - url 中带有子目录的 Response.Redirect