2016-11-02 42 views
0

我寫了下面的SQL查詢空引用異常()

SELECT  * 

FROM   dbo.PR_ADDRESS LEFT OUTER JOIN 
       dbo.Book_MarkText ON dbo.PR_ADDRESS.GroupID = dbo.Book_MarkText.BMData 
where 
     dbo.PR_ADDRESS.GroupID = dbo.Book_MarkText.BMData 

OR 
     PR_ADDRESS.GroupID in ('001','002','003') 

以LINQ作爲

string[] srGroupIDs = new string[] { "001", "002", "003" }; 
var objResult = 
     (from PR_ADDRESS in dtPR_ADDRESS.AsEnumerable() 
     join 
      Book_MarkText in dtBookmarkText.AsEnumerable() on 
     (string)PR_ADDRESS["GroupID"] equals (string)Book_MarkText["BMData"] 
                   into Book_MarkText_join 

      from Book_MarkText_Temp in Book_MarkText_join.DefaultIfEmpty() 
      where srGroupIDs.Contains(PR_ADDRESS["Groupid"]) 
      || ((string)PR_ADDRESS["Groupid"] == (string)Book_MarkText_Temp["BMData"]) 

      select new 
      { 
       ID = PR_ADDRESS["ID"], 
       Name1 = PR_ADDRESS["Name1"] 
      }).ToList(); 

但給我就行空引用異常

where srGroupIDs.Contains(PR_ADDRESS["Groupid"]) 
       || ((string)PR_ADDRESS ["Groupid"] == (string)Book_MarkText_Temp["BMData"]) 

爲什麼?

如果我刪除.DefaultIfEmpty(),這個工程無一例外,但我需要'左外部聯接',所以不能刪除.DefaultIfEmpty()。我如何解決它?

編輯: -

我添加了OR情況下,也希望現在很明顯

+5

那麼你需要處理其中'Book_MarkText_Temp'是空的情況下,因爲這是'DefaultIfEmpty()'那樣 - 它會是空的,你最終用一個默認值的序列...在這種情況下爲null。目前還不清楚,爲什麼你有'where'子句,因爲你只是*完成*加入... –

+0

我不能刪除where子句,因爲where子句中還有OR條件,這是至關重要的,在問題中沒有提到。 – pravprab

+0

對,所以你決定留下重要的信息,這使得它很難幫助你。您提供的where子句在SQL和LINQ中都是毫無意義的。你正在做一個連接,然後檢查連接是否正常工作,基本上......但是同時把它變成一個內部連接。 –

回答

0

通過處理Book_MarkText_Temp null作爲喬恩斯基特的評論.Thanks尋找時間來幫助我解決。

string[] srGroupIDs = new string[] { "001", "002", "003" }; 

var objResult = 
     (from PR_ADDRESS in dtPR_ADDRESS.AsEnumerable() 
       join 
      Book_MarkText in dtBookmarkText.AsEnumerable() on 
      (string)PR_ADDRESS ["GroupID"] equals (string)Book_MarkText["BMData"] into Book_MarkText_join 

    from Book_MarkText_Temp in Book_MarkText_join.DefaultIfEmpty()      
    where Book_MarkText_Temp == null ? srGroupIDs.Contains(PR_ADDRESS["Groupid"]) : 

    srGroupIDs.Contains(PR_ADDRESS["Groupid"]) 
    || ((string)PR_ADDRESS["Groupid"] == (string)Book_MarkText_Temp["BMData"]) 

    select new { 
        ID = PR_ADDRESS ["ID"], 
        Name1 = PR_ADDRESS ["Name1"] 
       }).ToList();