在查询Azure存储表时,我得到一个异常。
这是我的查询:
tableClient.QueryAsync<Resource>(resource => resource.PartitionKey == projectId.ToString()
&& String.Equals(resource.FullName, fullName, StringComparison.InvariantCultureIgnoreCase));
resource.FullName
和fullName
均为string
型。
但是这会导致异常…
为调用方法Boolean Equals(System. js)提供的参数数量不正确。字符串,系统。字符串,System.StringComparison)'(参数'method')
同样,如果我添加一个额外的条件(在String.Equals
之前)…
&& !String.IsNullOrWhiteSpace(resource.FullName)
…这会导致异常…
方法不支持IsNullOrWhiteSpace。
如果我将字符串比较更改为…
resource.FullName.ToLower() == fullName.ToLower()
…然后我被告知不支持ToLower
。
这是怎么回事?为什么我不能在类型为string
的属性上调用String.Equals
或String.IsNullOrWhiteSpace
?我是否误解了什么,resource.FullName
实际上不是string
?
请遵循以下建议并检查是否有帮助。
- 请检查
String.Equals
是否更新为String.Compare? - 而不是使用ToLower()方法,你可以尝试使用
String.Compare
方法StringComparison。OrdinalIgnoreCase选项实现不区分大小写的比较:
tableClient.QueryAsync<Resource>(resource =>
resource.PartitionKey == projectId.ToString() &&
String.Compare(resource.FullName, fullName, StringComparison.OrdinalIgnoreCase) == 0);
- 您也可以将
String.IsNullOrEmpty
方法与String一起使用。调整方法:
tableClient.QueryAsync<Resource>(resource =>
resource.PartitionKey == projectId.ToString() &&
!String.IsNullOrEmpty(resource.FullName) &&
!String.IsNullOrEmpty(resource.FullName.Trim()));
希望对你有帮助。
SDK尝试将您的LINQ-ish语句转换为可以由Azure表存储资源处理的查询,以返回适当的项。您尝试在其中调用的方法也不能转换,因为SDK还没有实现它们。要么是因为SDK没有实现,要么是因为Azure表存储在其查询中不支持类似的方法。
对于您的场景,这是因为Azure表存储不支持不区分大小写的查询。因此,您需要将数据更改为始终小写或大写。或者检索条目并在本地过滤条目。