Linq 在IEnumerable上尝试FirstOrDefault时引发TargetInvocationException异常

Linq 在IEnumerable上尝试FirstOrDefault时引发TargetInvocationException异常,linq,entity-framework-4,azure,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 {

我怀疑我遗漏了一些很基本的东西,但我无法理解这一点

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

        }
出于某种原因,这会生成一个内部异常为
NullReferenceException
targetingexception

当linq查询不产生结果时会发生这种情况,但我的印象是,
FirstOrDefault
将返回
Default
,而不是抛出异常


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

,可能有两个原因:

  • 提供者。值
  • id.值
您确定这些空值具有值吗。您可能需要先检查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();

}

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


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

这里有一些有趣的方法,试着像这样把where查询换成另一种方式,看看它是否有效(我刚才听说它有效!):

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


这是一个疯狂的Azure存储问题。

我找到了答案-当id或提供者的值中有“/”时,问题就出现了,id就是这样做的。当我删除它时,代码运行良好

有一个关于“关键字段中不允许使用字符”的部分-

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

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

感谢maxlego,这很有趣,因为我从来没有考虑过查看linq语句(而且应该考虑过),我发现有趣的是id.Value和provider.Value都不是空的,如果我删除where子句,这很好,我会得到异常。还有-每个方程本身都可以很好地工作,因为两者似乎都会出于某种原因导致问题?谢谢,我最初尝试将其设置为true,但似乎没有任何区别。这是一个很长的过程,因为另一个想法,是provider.Value还是id.Value null?谢谢,但是没有-我已经确认,当查看Maxlego的回答时,感谢BD,正如我提到的IgnoreResourceNotFoundException对我不起作用,现在不确定,现在我很惊讶没有找到“id”和“provider”的HasValue属性,你能想一下为什么会这样吗?provider和id对象代表什么?如果您在查询中放置了两个硬编码的值,而不是它们,并且这些值不会生成任何行,您仍然会得到相同的异常吗?虽然文档中没有提到,但我还发现以下字符可以在分区/行键中使用,但如果您尝试删除键(%)和中包含它们的行,则会导致问题(�)
where (id.HasValue && u.RowKey == id.Value) && (provider.HasValue && u.PartitionKey == provider.Value)