我尝试将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的样式表示。
以下是原始代码:
我在这里感到困惑的是
x.RowKey.CompareTo(UnpublishedRowKeyPrefix) >= 0
UnpublishedRowKeyPrefix
的位置:
private const string UnpublishedRowKeyPrefix = "Unpublished_";
你怎么能比较那个意义呢?我错过了什么?!
eventTableServiceEntities来自这里 - 我创建了一个变量以帮助调试:
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();
答案 0 :(得分:2)
您提供的字符串比较按以下方式进行: 当您过滤值&gt; =&#34; a&#34;和&lt; &#34; b&#34;,你将收到以&#34; a&#34;开头的所有字符串。因此,对于您的示例,看起来过滤器适用于以&#34; Unpublished _&#34;开头的所有字符串。但是低于您设置的UnpublishedRowKeyPrefixUpperLimit。至于制作Linq查询的帮助,这个link应该可以帮助您理解Fluent模式和较新的IQueriable模式之间的差异,以便编写查询以及如何从一个转换到另一个。 (相关内容在页面的中间位置。)