2012-08-24 48 views
3

我試圖對2個對象執行左外部連接並出現錯誤:未將對象引用設置爲對象的實例。左外部連接,對象引用未設置爲對象的實例

的物體看起來像

var deliverables = OCHART.GetACAPValues(organization, ReportingPeriod, FiscalYear, "(09-10.10a) Outreach Significant").ToList(); 
    var references = (from rf in OCHART.References where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2") select rf).ToList(); 

在哪些可交付往往可能返回0的記錄。不幸的是,我不能僅僅從數據庫中加入兩張表,因此可交付成果必須是一個對象。

可有人請點我在正確的方向

感謝,

我的代碼是

var items = (from rf in references 
       join pt in deliverables on rf.Description equals pt.b into prt 
       from x in prt.Where(prt2 => prt2.a.Equals(audience)).DefaultIfEmpty() 
       where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2") 
       select new 
       { 
        audience = (string)(audience == null ? "" : audience), 
        RefType = (string)(rf.RefType == null ? "" : rf.RefType), 
        RefOrder = (int)(rf.RefOrder == null ? 0 : rf.RefOrder), 
        refName = (string)(rf.Description == null ? "" : rf.Description), 
        collumn_attr = (string)(x.b == null ? string.Empty : x.b), 
        value = (int)(x.ACAP == null ? (int?)null : x.ACAP) 
       }) 
       .OrderBy(o => o.RefOrder) 
       .Take(9) 
       .ToList(); 

編輯: 經過一些調試運行,似乎我在下面得到錯誤我的代碼中的行

collumn_attr = (string)(x.b == null ? string.Empty : x.b), 
value = (int)(x.ACAP == null ? (int?)null : x.ACAP) 

即使我在交付件中有值(添加用於測試)並且值匹配時,我也會注意到查詢會正確執行,但是當我收到錯誤消息時交付件中沒有匹配時。

該問題可能與處理空值有關。

回答

4

我覺得x爲null,並且是導致如下的NullReferenceException

collumn_attr = (string)(x.b == null ? string.Empty : x.b), 
value = (int)(x.ACAP == null ? (int?)null : x.ACAP) 

這個判斷是基於from x in線的DefaultIfEmpty()調用,典型的左外-joins。

在數據庫代碼中,您可以編寫類似x.ACAP == null的東西來檢測沒有匹配聯接元素的情況。如果你改變這個替換'x.property == null'檢查與「x == null」檢查,我懷疑你的問題將被清除。

第二行仍然存在問題 - 如果您嘗試將值(int?)null轉換爲整數,您將在運行時得到異常。在x == null將清除該值的情況下,使用諸如0的有意義的默認值int

+0

+1:是的,我認爲你在那裏是正確的。 – code4life

+1

我嘗試了你的建議,你發現,我做了value =(int)(x == null?0:x.ACAP),現在一切正常。真的很感謝幫助。謝謝。 – Dmitris

1

如果您在執行查詢之前瀏覽您的代碼,您是否確實看到「可交付成果」和「引用」正在填充數據?

調查您在查詢中使用的所有子表/屬性。您得到該錯誤的原因很可能是因爲您在比較時使用的某個屬性爲空。例如, .RefType .Comment。 也許.RefType爲空,最後在排序時遇到問題。很難說沒有看到這兩個集合中有什麼。添加您的評論後

需要注意的是,最好不要使用.Equals()時,您的變量可能是空。使用==代替。參考:http://www.dotnetperls.com/string-equals

也想象一下(x.ACAP == null ? (int?)null : x.ACAP)返回null。 您正在將整個事件作爲int進行投射:value = (int)(x.ACAP == null ? (int?)null : x.ACAP)。鑄造nullint顯然會失敗

+0

總是被填充的引用,但交付列表具有的值爲0的機會,是空的沒有任何記錄,當我調試代碼時,我得到的錯誤是在collumn_attr =(字符串)(xb == null?string.Empty:xb)行,並在行value =(int)(x.ACAP == null?( int?)null:x.ACAP) – Dmitris

+0

我更新了我的答案。 – Shenaniganz

+0

即使我在交付件中有值(添加用於測試),並且值匹配時,我也會注意到查詢會正確執行,但是如果沒有匹配,則會收到錯誤消息。這個問題可能與處理空值有關。 – Dmitris

0

只是爲了記錄在案,在C#6.0中的新空,條件運算符可以使用這樣的:

   collumn_attr = x?.b ?? string.Empty, 
       value = x?.ACAP 
相關問題