2015-04-27 36 views
-1

我是新來的LINQ和實體框架,並正在就這一查詢接收空引用異常:對象引用錯誤 - LINQ的

using (var db = new PhoenixContext()) 
{ 
    tblCustomer cust = (from c in db.tblCustomer 
         where c.CustomerID == _CustomerID 
         select c).FirstOrDefault(); 

    string altPhone; 
    altPhone = cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone.Where(p => p.PhoneTypeID == 2).FirstOrDefault().Phone; 
) 

有在tblCustomerContactInformationPhone單行。 Where子句應該刪除它,並且我最終應該得到一個空字符串。但是,相反,我得到:

Object reference not set to an instance of an object. 

我在做什麼錯了,我怎麼正確地做到這一點,使查詢結果爲空時正確地轉換爲一個空字符串?

鏈接的問題是沒有用的,因爲這是特定於使用Linq,該問題不包括。 @ evanmcdonnal的回答很有幫助,並解決了我的問題。

+0

請顯示所有相關代碼的含義如何定義cust以及您聲明的所有其他對象。您不能聲明對象的實例,例如「MyObject myobject;」,並期望獲得訪問權限或分配值到任何它的字段或屬性沒有'Nweing'對象..做一個谷歌搜索關於如何實例化的例子對象引用 – MethodMan

+0

'.FirstOrDefault()'返回'null'如果沒有行返回。你不能訪問'nul​​l.Phone'。 – Blorgbeard

+0

可能的重複[什麼是NullReferenceException,我該如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Blorgbeard

回答

2

這可能會被關閉,因爲您的問題重複了1000000000000個其他的NullReferenceException問題,之前曾被問過。

想想這​​

當存在tblCustomerContactInformationPhone爲2的PhoneTypeID沒有項目,會發生什麼? FirstOrDefault會給你'默認',在這種情況下是null,然後你做TheValueRetuendFromFirstOrDefaultWhichIsNull.Phone並得到一個NullReferenceException。

反而將它分成兩行。

string phone = String.Empty; 
var temp = cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone.Where(p => p.PhoneTypeID == 2).FirstOrDefault(); 

if (temp != null) 
    phone = temp.Phone; 

編輯:另一種選擇是使用選擇來獲取Phone值,以便可以使用空合併運算符像你想。那看起來像這樣;

var phone = cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone.Where(p => p.PhoneTypeID == 2).Select(x => x.Phone).FirstOrDefault() ?? String.Empty; 

這工作得很好,因爲如果沒有一個是由哪來那麼你最終剛剛從FirstOrDefault空回在這種情況下,你會拿空字符串返回在選擇的lambda表達式將被應用到0元。

+0

謝謝。兩種方法都可以工作,儘管你的更新版本基本上是我想要做的。對Linq沒有太多的瞭解,使得這些簡單的事情對我來說很困難。 –

1

這一條款:

cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone.Where(p => p.PhoneTypeID == 2).FirstOrDefault().Phone ?? String.Empty; 

您正在訪問一個可能的空引用的Phone財產。

你可以做如下:

var contactinfo = cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone.FirstOrDefault(p => p.PhoneTypeID == 2); 

if(contactinfo != null){ 
    Console.Write(contactinfo.Phone); 

} 
0

當您使用FirstOrDefault,該tblCustomerContactInformationPhone的 「默認」 值爲null。如果該表的查詢沒有找到任何內容(意思是沒有滿足2的PhoneTypeID的記錄),您將得到null,並且在您的代碼中,您試圖獲得nullPhone。你的??在這裏沒用。

1

很可能沒有任何與您的PhoneTypeID == 2條件匹配的條目,因此.FirstOrDefault()返回null。嘗試訪問.Phone屬性會拋出空引用異常。

其他的答案表明,你可以做的.FirstOrDefault()結果的空檢查,但有可以與實體框架使用,只查詢爲Phone財產,避免選擇比你更多的數據的另一個絕招需要:

altPhone = cust.tblCustomerContactInformation1.tblCustomerContactInformationPhone 
    .Where(p => p.PhoneTypeID == 2) 
    .Select(p => p.Phone) 
    .FirstOrDefault() ?? ""; 

這是可行的,因爲SQL Server在運行到空值時不會引發異常,而是傳播空值。