Azure Table 查询问题

Azure Table Query issues

我正在尝试将 MS PnP CQRS 项目升级到最新的 Azure SDK,我有以下 2 个查询:

var query = new TableQuery<EventTableServiceEntity>().Where(
    TableQuery.CombineFilters(
        TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, UnpublishedRowKeyPrefix),
        TableOperators.And,
        TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, UnpublishedRowKeyPrefixUpperLimit)))
            .Select(x => new { x.PartitionKey })
            .AsTableQuery();

var query2 = eventTableServiceEntities
    .Where(
        x =>
            String.Compare(x.RowKey, UnpublishedRowKeyPrefix, StringComparison.Ordinal) >= 0 &&
            String.Compare(x.RowKey, UnpublishedRowKeyPrefixUpperLimit, StringComparison.Ordinal) <= 0)
   .Select(x => new { x.PartitionKey }).AsTableQuery();

第一个没有错误(无论如何我认为查询是错误的)第二个是原始的,现在错误为object reference not set to an instance of an object

1:第二个查询有什么问题?现在不支持这种风格了吗?还没到执行的地步呢!

2:第二个查询在做什么,如果放弃 linq 样式,我将如何以查询 1 的样式表示它。

原代码如下:

https://github.com/mspnp/cqrs-journey/blob/master/source/Infrastructure/Azure/Infrastructure.Azure/EventSourcing/EventStore.cs#L215

我在这里感到困惑的是

x.RowKey.CompareTo(UnpublishedRowKeyPrefix) >= 0

其中 UnpublishedRowKeyPrefix 是:

private const string UnpublishedRowKeyPrefix = "Unpublished_";

你怎么能比较有意义呢?我错过了什么?!

eventTableServiceEntities 来自这里 - 我创建了一个变量来帮助调试:

https://github.com/dpiessens/cqrs-journey-code/blob/master/source/Infrastructure/Azure/Infrastructure.Azure/EventSourcing/EventStore.cs#L213

var eventTableServiceEntities= new TableQuery<EventTableServiceEntity>();
var query2 = eventTableServiceEntities
            .Where(
                x =>
                String.Compare(x.RowKey, UnpublishedRowKeyPrefix, StringComparison.Ordinal) >= 0 &&
                String.Compare(x.RowKey, UnpublishedRowKeyPrefixUpperLimit, StringComparison.Ordinal) <= 0)
            .Select(x => new { x.PartitionKey })
            .AsTableQuery();

您提供的字符串比较按以下方式进行: 当您过滤值 >= "a" 和 < "b" 时,您将得到所有以 "a" 开头的字符串。因此,对于您的示例,过滤器似乎适用于所有以 "Unpublished_" 开头但低于您设置的 UnpublishedRowKeyPrefixUpperLimit 的字符串。关于编写 Linq 查询的帮助,此 link 应该可以帮助您了解 Fluent 模式和较新的 IQueriable 模式在编写查询方面的区别以及如何从一种模式转换为另一种模式。 (相关内容在页面的下半部分。)