2011-11-28 95 views
1

我懷疑我錯過了一些相當基本的東西,但我無法弄清楚這一點。在IEnumerable上嘗試FirstOrDefault時拋出TargetInvocationException異常

我運行一個簡單的LINQ查詢 -

var result = from UserLine u in context.Users 
      where u.PartitionKey == provider.Value && u.RowKey == id.Value 
      select u; 
     UserLine user = null; 
     try 
     { 
      user = result.FirstOrDefault(); 

     } 

出於某種原因,這將產生一個TargetInvocationExceptionNullReferenceException內部異常。

這發生在linq查詢沒有產生任何結果時,但我的印象是FirstOrDefault會返回Default<T>而不是拋出異常?

我不知道,如果它的事項,但UserLine類繼承自Microsoft.WindowsAzure.StorageClient.TableServiceEntity

+1

提供者和id對象代表什麼?如果不是他們,你在查詢中放置了幾個硬編碼的值,不會產生任何行,你仍然會得到相同的異常? –

回答

1

我想通了 - 當id或提供者的值爲'/'時,出現問題,id爲id。當我刪除它的代碼運行正常

Understanding the Table Service Data Model有「重點領域不允許的字符」上一節 -

下面的字符不值允許的 PartitionKey和RowKey屬性:

  • 正斜槓(/)字符
  • 反斜線字符()
  • 數字符號(#)字符
  • 問號(?)字符
+0

儘管在文檔中沒有提到,但我還發現可以在分區/行鍵中使用以下字符,但如果您嘗試在鍵(%)和( )中使用它們刪除行, – knightpfhor

1

有兩個可能的原因:

  • provider.Value
  • id.Value

你確定這些空值有價值嗎?你可能想之前

var result = from UserLine u in context.Users 
      where (provider.HasValue && u.PartitionKey == provider.Value) 
       && (id.HasValue && u.RowKey == id.Value) 
      select u; 
UserLine user = null; 
try 
{ 
    user = result.FirstOrDefault(); 

} 
+0

感謝maxlego,有趣,因爲我從來沒有考慮看linq語句(應該有),我發現有趣的是兩個id.Value和provider.Value不是null,如果我刪除where子句這工作正常隨着它我得到了例外。還有 - 它自己的每個方程都很好,因爲某些原因,這兩個方程似乎都會導致問題? –

1

檢查的HasValue我想就產生了不同的錯誤,而是基於在其中發生問題,你可能想看看檢查是否context.IgnoreResourceNotFoundException設置爲false的情況呢?如果它嘗試將其設置爲true。

This property是一個標誌,用於指示在查詢中同時使用PartitionKey和RowKey時是否要存儲庫拋出並出錯,並且沒有找到結果(當您考慮底層REST API的含義時這樣做,但它是一個有點混亂,當你使用LINQ)

+0

謝謝,我試圖將它設置爲true,它似乎沒有任何區別 –

+0

公平不夠,這是一個長鏡頭 – knightpfhor

+0

作爲另一種想法,要麼是provider.Value或id.Value null? – knightpfhor

0

下面是一些有趣的嘗試把這裏查詢其他方式這樣,看看它的工作原理(聽說前一陣子它!):

where (id.HasValue && u.RowKey == id.Value) && (provider.HasValue && u.PartitionKey == provider.Value) 

除此之外,您現在可以將TableServiceContext中的IgnoreResourceNotFoundException = true設置爲receiv如果沒有找到實體而不是錯誤,則爲null。

這是一個瘋狂的Azure存儲的東西。

+0

感謝BD,正如我所提到的IgnoreResourceNotFoundException並不適用於我,現在還不確定,現在我很驚訝沒有找到一個HasValue屬性' id'和'provider',你能想到爲什麼會這樣嗎? –