如何返回'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));
        }
    }
}

如何返回'guide '从一个'Nullable<Guid>'

// 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是共享的,它可以在HasValueValue之间分配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

之后添加。firstordefault ()

结构体不能为空,但是System。

你得到的是一个没有执行的查询,对于两个,它将返回一个Guids列表,据我所知。如果你想返回第一个Guid或默认值(我认为是一个零值Guid),你可以在select.

后输入。firstordefault ()

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
    }
}