我怀疑我错过了一些基本的东西,但我无法想出这个。
我正在运行一个简单的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
答案 0 :(得分:1)
有两个可能的原因:
你确定theese nullables有价值吗?您可能希望在
之前检查HasValuevar 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存储事物。