我试图在下面返回一个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));
}
}
}发布于 2011-04-14 19:40:19
// 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可能适合更改逻辑,并注意,如果maybeGuid“无值”-- is null --则Value将抛出异常,这就是需要保护的原因。
编码愉快。
迂回的细节:等效的方法不是“线程安全”。也就是说,假设maybeGuid是共享的,则可以在HasValue和Value之间分配null。有许多这样的问题涉及到?? (合并操作符)的“线程安全”--生成的IL有效地使用了一个临时变量,因此该值可能过时,但不能抛出异常。
发布于 2011-04-14 19:38:23
您得到的是一个没有对一个查询执行的查询,对于两个查询,它将返回一个Guid列表,据我所知。如果您想返回第一个Guid或默认值(我认为这是一个零的输出guid),您可以在选择之后使用.FirstorDefault()。
发布于 2011-04-14 19:42:32
试一试
Change your return type from System.Guid to ?System.Guid // nullable of guid Then add .FirstOrDefault() after the select call结构不能为空,但System.Nullable类将结构包装在类中。
https://stackoverflow.com/questions/5668673
复制相似问题