我在我的应用程序中经常出现这样的情况,我创建了一个查询来获取 partitionkey 是常量但 rowkey 应该在词法范围内的所有实体(例如,只有以某个前缀开头的行):
//query to get all entities in partition "KnownPartition" where RowKey starts with "Prefix_"
CloudTableQuery<MyEntity> query =
(from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
where e.PartitionKey == "KnownPartition"
&& e.RowKey.CompareTo("Prefix_") > 0
&& e.RowKey.CompareTo("Prefix`") <= 0 // ` is '_' + 1
select e).AsTableServiceQuery();
我必须使用 CompareTo,因为此类查询不支持 StartsWith 等字符串函数。这行得通,但是条件很难阅读并且重复了很多次。因此,与其使用这种难以阅读的条件编写大量查询,我更愿意创建一个“内联”它的函数:
public static Boolean HasPrefix(this String rowKey, String prefix)
{
return rowKey.CompareTo(prefix + '_') > 0 && rowKey.CompareTo(prefix + '`') <= 0;
}
CloudTableQuery<MyEntity> query =
(from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
where e.PartitionKey == "KnownPartition" && e.RowKey.HasPrefix("Prefix")
select e).AsTableServiceQuery();
但是当我运行它时,我从 Azure 收到一个关于我的功能不受支持的异常。有没有办法写这个以便支持它?毕竟,我使用的条件与有效的查询完全相同,只是包装在一个函数中......