C#LINQ存储int?作为int

时间:2014-09-24 09:25:25

标签: c# .net linq

我正在查询数据库以获取 contractorid 字段值,该值将返回一个值或null。 我需要将它作为整数传递给类方法(int,int)。但显然它与最佳超载方法不匹配。我怀疑它是因为int?承包商的值可能为null并且无法转换为整数。但是,如果我删除?并且只使用int,那么我在linq中得到关于single()方法的错误

    int UserID = new BussinessComponent().LoginDetails.UserID;
    using (var db = new DataContext())
    {
        int? ContractorID =
              db
                  .Users
                  .Where(x => x.UserID == UserID)
                  .Select(x => x.ContractorID)
                  .Single();


        ltlOJ.Text = DashboardComponent.GetJobs(UserID,ContractorID ).ToString();
   }

5 个答案:

答案 0 :(得分:8)

确实,您需要将int?转换为int,因为null无法转换为int。

您可以使用'GetValueOrDefault()`执行此操作以获得默认值。

ltlOJ.Text = DashboardComponent.GetJobs(UserID, ContractorID.GetValueOrDefault(0))
    .ToString();

答案 1 :(得分:1)

尝试

int UserID = new BussinessComponent().LoginDetails.UserID;
using (var db = new DataContext())
{
    int ContractorID =
          db
              .Users
              .Where(x => x.UserID == UserID)
              .Select(x => x.ContractorID ?? 0)
              .Single();


    ltlOJ.Text = DashboardComponent.GetJobs(UserID,ContractorID ).ToString();

}

当数据库中的空值

时,这会将ContracterId局部变量设置为0

答案 2 :(得分:1)

你可以这样做。

int? ContractorID = db
     .Users
     .Where(x => x.UserID == UserID)
     .Select(x => x.ContractorID)
     .Single() ?? -1;

int parsedValue = ContractorID.Value;

或者也许......

int? ContractorID = db
     .Users
     .Where(x => x.UserID == UserID)
     .Select(x => x.ContractorID)
     .Single()

if (ContractorID.HasValue)
    ltlOJ.Text = DashboardComponent.GetJobs(UserID,ContractorID ).ToString();
else
    // Traitment if contractorId has no value.

祝你好运; - )

答案 3 :(得分:0)

我认为你正在处理Single()在你脸上爆炸的情况? Single()只有在找到完全一个匹配项时才会感到满意。即0匹配和2场比赛将使其爆炸。

int UserID = new BussinessComponent().LoginDetails.UserID;
using (var db = new DataContext())
{
    int? ContractorID =
          db
              .Users
              .Where(x => x.UserID == UserID)
              .Select(x => x.ContractorID)
              .Single();

    if (ContractorID.HasValue) // check for value, since it is nullable it can be null
      ltlOJ.Text = DashboardComponent.GetJobs(UserID, ContractorID.Value).ToString();
    else
      throw new MyReasonableExceptionToThrowHere(string.Format("Missing ContractorID for UserID '{0}'", UserID));
}

对于int?本身,因为它是可以为空的,你必须将其取消以获取内部值,这就是你在调用Nullable<T>.Value时所做的事情。请注意,如果值为null,则Nullable<T>.Value会抛出,您是否应该始终使用Nullable<T>.HasValue进行检查。

答案 4 :(得分:-1)

如果无法找到匹配项,Single()方法将抛出异常。你应该考虑使用SingleOrDefault()