2012-08-25 69 views
1

我已經使用LINQ,但只有搜索ID和它完美正確的查詢LINQ

var obj = (from VAR in db.infos 
      where VAR.id == 22                     
      select new 
      { 
       title = VAR.title, 
      }).SingleOrDefault(); 
Label2.Text = obj.title.Trim(); 

如果我嘗試由地點搜尋得到一個錯誤

var obj = (from VAR in db.infos 
      where VAR.location.Trim() == "Lim" 
      select new 
      { 
       title = VAR.title.Trim(), 
      }).SingleOrDefault(); 

     SearchJob.Items.Add(obj.title.Trim()); 
     Label2.Text = obj.title; 

有在標籤2線誤差工作

對象引用不設置爲一個對象的一個​​實例。

如何解決呢?

if (obj.title != null) 
{ 
    SearchJob.Items.Add(obj.title.Trim()); 
    Label2.Text = obj.title; 
} 

對象引用不設置爲一個對象的一個​​實例。

SOLUTION

變化SingleOrDefault()FirstOrDefault()

+3

確定「廉」是數據?您查詢SingleOrDefault。結果你可能會得到一個空值。 – Joppe

+0

檢查你是否從linq查詢中得到null結果。 –

+0

@Did你試着用'FirstOrDefault()'這個環節可能是你 http://stackoverflow.com/questions/1745691/linq-when-to-use-singleordefault-vs-firstordefault-with-filtering-有用標準 – Raghuveer

回答

1

你正在做一些骯髒的東西在那裏,非常不好的習慣。比如這個:

var obj = (from VAR in db.infos 
      where VAR.location.Trim() == "Lim" 
      select new 
      { 
       title = VAR.title.Trim(), 

      }).SingleOrDefault(); 

SearchJob.Items.Add(obj.title.Trim()); 
Label2.Text = obj.title; 

是廢話!讓我告訴你爲什麼:

在將數據插入到數據庫之前,請務必檢查數據,而不是在AFTER之後。這樣就會產生很多不必要的開銷,這可以完全避免。修剪數據之前,從未之後。

接下來的事情 - 你只需要一個字符串值,但你創建一個匿名對象。爲什麼?做到這一點,而不是:

string title = (from o in db.infos 
       where o.location == "Lim" 
       select o.title).SingleOrDefault(); 

使用SingleOrDefault,如果你希望一個結果或無。但是,如果您希望得到多個結果並只想要第一個結果,請使用FirstOrDefault

正如你所看到的,我使用o代替VAR。確實這並不重要,但是,使用與保留字(var)中的一個非常相似的單詞永遠不是一個好主意。

如果你得到一個異常Object reference not set to an instance of an object.,這意味着你的查詢返回一個null,並且你試圖訪問一個不存在的對象。如果您的查詢可能在某個時候返回null,那麼在訪問成員時總是檢查null!

編輯

if (obj.title != null) 

是太糟糕,因爲你需要檢查空對象本身!

if (obj != null) 

如果你真的想用你的壞方法。

1

我想在查詢

在第一個查詢中出現錯誤,你有源db.infos

在第二你有源db.jobinfos

信號源變更

如果我們指定空的文本標籤,它會顯示,它看起來像obj.title不存在,或者你是由於錯誤的源獲取您的查詢錯誤。

的OBJ沒有返回標題字段。通過調試來檢查obj。

+0

錯字我使用相同的DB – CyberDx

+0

好的。你是否在var中獲取數據?你有調試你的查詢嗎? –

+0

@Cyber​​Dx我編輯了您的問題並更新了源代碼。 –

0

嘗試跳過例外:)

 public static class LINQException { 

    public static void TryExample() { 
     var LsWithEx = from p in Enumerable.Range(0, 10) select int.Parse("dsfksdj"); 
     var LsSkipEx = (from p in Enumerable.Range(0, 10) select int.Parse("dsfksdj")).SkipExceptions(); 
    } 

    public static IEnumerable<T> SkipExceptions<T>(this IEnumerable<T> values) 
    { 
     using (var enumerator = values.GetEnumerator()) 
     { 
      bool next = true; 
      while (next) 
      { 
       try 
       { next = enumerator.MoveNext();} 
       catch 
       { continue;} 
       if (next) yield return enumerator.Current; 
      } 
     } 
    } 
} 
    var obj = (from VAR in db.infos 
       where VAR.location.Trim() == "Lim" 
       select new 
       { 
        title = VAR.title.Trim(), 

       }).SkipExce.SingleOrDefault();