如何返回'guide '从一个'Nullable'
本文关键字:Nullable 一个 Guid 何返回 返回 guide | 更新日期: 2023-09-27 17:50:18
我试图在下面返回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是"没有值"——是null
——这就是需要保护的原因。
幸福的编码。
迂腐的细节:等效方法不是"线程安全的"。也就是说,假设maybeGuid
是共享的,它可以在HasValue
和Value
之间分配null
。有许多SO问题涵盖??
的"线程安全"(合并操作符)——生成的IL有效地使用临时变量,因此值可能是过时的,但不能抛出异常。
使用
.Select(workHist => workHist.Worker).Single();
-
.Select()
返回一个尚未运行的查询。 - 如果你使用
.Select().ToList()
,那么你返回一个列表。 - 如果你使用
.Select().Single()
,那么你返回一个项目和它确保只有一个项目 - 如果您使用
.Select().SingleOrDefault()
,那么您返回一个项目和默认值。查询项不能超过1项。 - 如果使用
.Select().First()
,则返回第一项。查询必须包含至少1项。 - 如果您使用
.Select().FirstOrDefault()
,则返回第一项或默认值。查询可包含1个或多个条目,也可不包含。
Try
从System中更改返回类型。引导到?系统。Guid//Guid为空然后在select call
结构体不能为空,但是System。
你得到的是一个没有执行的查询,对于两个,它将返回一个Guids列表,据我所知。如果你想返回第一个Guid或默认值(我认为是一个零值Guid),你可以在select.
用Guid
表示null
最接近的是用Guid.Empty
。因此,对于您的查询,您可能希望首先选择FirstOrDefault
返回的值,进行空检查,然后返回一个合理的值:
Guid? result = tWorkHist.Where(workHist =>
(workHist.EnrollmentID == enrollmentID)
&& (workHist.tblStaff.StaffTypeID == staffTypeID)
&& (workHist.EndDate == null || workHist.EndDate > DateTime.Now))
.Select(workHist => workHist.Worker)
.FirstOrDefault();
return result.HasValue ? result.Value : Guid.Empty;
使用与Guid连接的FirstOrDefault。空
试试这个:
public static Guid GetCurrentWorkerByType(int enrollmentID, int staffTypeID)
{
using (var context = CmoDataContext.Create())
{
IQueryable<tblWorkerHistory> tWorkHist = context.GetTable<tblWorkerHistory>();
var guid = (tWorkHist.Where(workHist => (workHist.EnrollmentID == enrollmentID) &&
(workHist.tblStaff.StaffTypeID == staffTypeID) &&(workHist.EndDate == null || workHist.EndDate > DateTime.Now))
.Select(workHist => workHist.Worker)
///####NOTICE THE USE OF FirstOrDefault
).FirstOrDefault();
return (guid.HasValue)?guid.Value:Guid.Empty
}
}