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