2014-09-24 110 views
2

我正在查詢數據庫以獲取contractorid字段值,該值將返回一個值或null。 我需要將它作爲整數傳遞給類方法(int,int)。但顯然它不符合最好的超載方法。我懷疑它是因爲int? contractorid值可能爲空,無法轉換爲整數。但是,如果我刪除?,只使用整數,那麼我得到錯誤有關single()方法在LINQC#LINQ存儲int? as int

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(); 
    } 
+1

嘗試SingleOrDefault() – ssilas777 2014-09-24 09:28:48

+0

將函數調用爲DashboardComponent.GetJobs(UserID,ContractorID ?? 0)。 – Priyank 2014-09-24 09:31:25

+0

@ ssilas777'SingleOrDefault'指的是返回的行數而不是值。所以你可以得到一個值,但這個值可以是'null'。 – 2014-09-24 09:33:15

回答

8

確實,您需要將您的int?轉換爲int,因爲null不能轉換爲int。

您可以使用'GetValueOrDefault()`爲您提供默認值。

ltlOJ.Text = DashboardComponent.GetJobs(UserID, ContractorID.GetValueOrDefault(0)) 
    .ToString(); 
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時,其空在DB

-1

如果找不到匹配項,Single()方法將拋出異常。你應該考慮使用SingleOrDefault()

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. 

祝您好運;-)

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你在做什麼。請注意,如果值爲空,則會拋出Nullable<T>.Value,您應該在檢查之前始終使用Nullable<T>.HasValue