我正在尝试将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模式之间的差异,以及如何从一种模式转换到另一种模式。(相关内容在页面的一半位置)>