Azure表查询问题

时间:2015-09-05 13:04:27

标签: c# azure azure-table-storage

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

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();

1 个答案:

答案 0 :(得分:2)

您提供的字符串比较按以下方式进行: 当您过滤值&gt; =&#34; a&#34;和&lt; &#34; b&#34;,你将收到以&#34; a&#34;开头的所有字符串。因此,对于您的示例,看起来过滤器适用于以&#34; Unpublished _&#34;开头的所有字符串。但是低于您设置的UnpublishedRowKeyPrefixUpperLimit。至于制作Linq查询的帮助,这个link应该可以帮助您理解Fluent模式和较新的IQueriable模式之间的差异,以便编写查询以及如何从一个转换到另一个。 (相关内容在页面的中间位置。)