在IEnumerable上尝试FirstOrDefault时抛出TargetInvocationException

时间:2011-11-28 21:45:10

标签: linq entity-framework-4 azure

我怀疑我错过了一些基本的东西,但我无法想出这个。

我正在运行一个简单的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();

        }

出于某种原因,这会产生TargetInvocationException,内部异常为NullReferenceException

当linq查询没有产生结果时会发生这种情况,但我认为FirstOrDefault会返回Default<T>而不是抛出异常?

我不知道这是否重要,但UserLine类继承自Microsoft.WindowsAzure.StorageClient.TableServiceEntity

4 个答案:

答案 0 :(得分:1)

有两个可能的原因:

  • provider.Value
  • id.Value

你确定theese nullables有价值吗?您可能希望在

之前检查HasValue
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();

}

答案 1 :(得分:1)

我认为它产生了不同的错误,但根据问题发生的情况,您可能希望检查context.IgnoreResourceNotFoundException是否设置为false?如果尝试将其设置为true。

property是一个标志,用于指示在查询中同时使用PartitionKey和RowKey时是否希望存储库抛出并出错,并且未找到结果(当您考虑底层内容时,这是有意义的REST API正在做,但是当你使用LINQ时会有点混乱

答案 2 :(得分:1)

我明白了 - 当id或提供者的值中有'/'时,问题就出现了。当我删除它时,代码运行良好

Understanding the Table Service Data Model有一个关于“关键字段中不允许使用的字符”的部分 -

  

以下字符不允许使用以下字符   PartitionKey和RowKey属性:

     
      
  • 正斜杠(/)字符
  •   
  • 反斜杠()字符
  •   
  • 数字符号(#)字符
  •   
  • 问号(?)字符
  •   

答案 3 :(得分:0)

这里有一些有趣的尝试将where查询反过来看看是否有效(我之前听过它的确如此!):

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

除此之外,您现在可以在TableServiceContext中设置IgnoreResourceNotFoundException = true,以便在找不到实体而不是错误时接收null。

这是一个疯狂的Azure存储事物。