无法在Azure存储表查询lambda中的字符串属性上使用基于字符串的方法



在查询Azure存储表时,我得到一个异常。

这是我的查询:

tableClient.QueryAsync<Resource>(resource => resource.PartitionKey == projectId.ToString()
&& String.Equals(resource.FullName, fullName, StringComparison.InvariantCultureIgnoreCase));

resource.FullNamefullName均为string型。

但是这会导致异常…

为调用方法Boolean Equals(System. js)提供的参数数量不正确。字符串,系统。字符串,System.StringComparison)'(参数'method')

同样,如果我添加一个额外的条件(在String.Equals之前)…

&& !String.IsNullOrWhiteSpace(resource.FullName)

…这会导致异常…

方法不支持IsNullOrWhiteSpace。

如果我将字符串比较更改为…

resource.FullName.ToLower() == fullName.ToLower()

…然后我被告知不支持ToLower

这是怎么回事?为什么我不能在类型为string的属性上调用String.EqualsString.IsNullOrWhiteSpace?我是否误解了什么,resource.FullName实际上不是string?

请遵循以下建议并检查是否有帮助。

  1. 请检查String.Equals是否更新为String.Compare?
  2. 而不是使用ToLower()方法,你可以尝试使用String.Compare方法StringComparison。OrdinalIgnoreCase选项实现不区分大小写的比较:
tableClient.QueryAsync<Resource>(resource => 
resource.PartitionKey == projectId.ToString() &&
String.Compare(resource.FullName, fullName, StringComparison.OrdinalIgnoreCase) == 0);
  1. 您也可以将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表存储不支持不区分大小写的查询。因此,您需要将数据更改为始终小写或大写。或者检索条目并在本地过滤条目。

相关内容

  • 没有找到相关文章

最新更新