2014-04-07 89 views
0

下面的代碼適用於已登錄用戶的信用卡表中已有記錄的情況;但是,當用戶在信用卡表中沒有條目時,查詢會按預期找到零個記錄。問題是,聲明maxccid = query.Maxccid();返回Null並引發InvalidOpeation異常。我無法將數據庫中的ccid字段設置爲空,因爲它是主鍵的一部分。我需要一種方法來檢測這個查詢是否會在我運行它之前返回一個null,或者一種方法來捕獲它(最好沒有嘗試捕獲,因爲這種情況對每個新客戶都會發生(Try/Catch狀態的最佳做法是沒有正確使用Try/Catch)只需要注意添加我正在使用實體框架如何檢測或處理MVC中的空查詢結果?

UPDATE 4/9/14:我修改了查詢以修復我在向用戶失敗程序的評論中報告的問題,邁克,我還有空的問題,但。

// Create CreditCard - Write to DB 
    public ActionResult Create(CreditCard model) 
    { 
     EntitiesContext context = new EntitiesContext(); 
     int uid = (int)WebSecurity.GetUserId(User.Identity.Name); // Currently logged-in user 
     short? maxccid = 0; //this will be the max ccid for this user 

     var query = from c in context.CreditCards 
        where c != null && c.UserId == uid select c.CCID; 
     maxccid = query.Max(); 
+0

if(query.Any())maxccid = query.Max(); – failedprogramming

回答

1
if(query.Any()) 
    maxccid = query.Max(); 
+0

謝謝邁克爾。這對我不起作用。這很奇怪,但是如果creditCard表中有三個或更多記錄,它會按我的預期(query.Any())執行,否則如果有一個或兩個記錄,它等於false,這不是我想要的。我想如果查詢返回一個或多個記錄,query.Any()應該返回true。 – SoCal

+0

我仍在努力,但我認爲這是邁克爾。我以前認爲它不是,但我發現我的查詢中有錯誤。 – SoCal

+0

是的,這是Michael的工作。謝謝。 – SoCal

0

首先使用using爲DATABSE對象。
其次,使用null-coalescing運算符。這裏處理空
檢查http://msdn.microsoft.com/en-us/library/ms173224.aspx

public ActionResult Create(CreditCard model) 
{ 

    using(EntitiesContext context = new EntitiesContext()) // using keyword will dispose the object properly. 
    { 
     int uid = (int)WebSecurity.GetUserId(User.Identity.Name); // Currently logged-in user 
     short? maxccid = 0; //this will be the max ccid for this user 

     var query = from c in context.CreditCards 
       where c.UserId == uid && c.CCID == (context.CreditCards.Max(c1 => c1.CCID)) select c.CCID ; 
     maxccid = query.Max() ?? 0; //use null-coalescing operator. 
    } 


} 

您可以優化這段代碼更根據您的需求。希望,它可能會在某些時候幫助你。祝你今天愉快。

+0

Pratik,感謝您對此採取措施。當我使用(EntitiesConext ....語句,它會導致context.CreditCards statment不喜歡上下文(在紅色處引用下劃線) – SoCal

+0

事情是你可以在那個特定的使用塊中使用該上下文對象。你不能在範圍之外使用它,如果你不能使用它,做一件事就不要使用它,只需要使用空colaescing操作符,它將幫助你 –

+0

Pratik,你不能使用Null合併操作符對象的類型爲short或int。代碼正常工作,但我發現查詢不會產生一致的結果。當CreditCards表中只有1或2條記錄時,query.Max()返回一個假的值,當有三個或更多的query.Max()返回一個真正的值,這是非常令人沮喪的,我想知道它是否與EntityFramwork有關,因爲我正在查詢上下文,而不是直接查詢數據庫? – SoCal