Azure表查询问题



我正在尝试将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查询的帮助,这个链接应该可以帮助你理解Fluent模式和较新的iquerable模式之间的差异,以及如何从一种模式转换到另一种模式。(相关内容在页面的一半位置)>

相关内容

  • 没有找到相关文章

最新更新