找到运算符类型“GreaterThanOrEqual”的操作数类型“Edm.DateTime”和“Edm.String”
Posted
技术标签:
【中文标题】找到运算符类型“GreaterThanOrEqual”的操作数类型“Edm.DateTime”和“Edm.String”【英文标题】:Found operand types 'Edm.DateTime' and 'Edm.String' for operator kind 'GreaterThanOrEqual' 【发布时间】:2021-08-15 17:36:35 【问题描述】:在尝试根据 Edm.DateTime 类型的 Timestamp 从 Azure Table 获取实体时出错:
StorageError: A binary operator with incompatible types was detected. Found operand types 'Edm.DateTime' and 'Edm.String' for operator kind 'GreaterThanOrEqual'
代码:
let res: IQueryPrePostAuthResponse[] = [];
let query = new TableQuery();
query = query.where('PartitionKey eq ?', searchQuery.user_id);
const entGen = TableUtilities.entityGenerator;
const dateFrom = entGen.DateTime(new Date(searchQuery.date_from));
const dateTo = entGen.DateTime(new Date(searchQuery.date_to));
query = query.and(
'Timestamp >= ? and Timestamp <= ?',
dateFrom,
dateTo,
);
在代码中,两个变量(dateFrom, & dateTo)都是 DateTime 类型,Timestamp 是日期时间类型。 根据Odata Docslink查询比较运算符,比较运算符两边的数据类型必须兼容。这是我的情况,两者都是一样的,然后我得到一个错误。
【问题讨论】:
【参考方案1】:当我在发送查询之前打印 dateTo 和 dateFrom。
const entGen = TableUtilities.entityGenerator;
const dateFrom = entGen.DateTime(new Date(searchQuery.date_from));
const dateTo = entGen.DateTime(new Date(searchQuery.date_to));
console.log(dateFrom);
console.log(dateTo);
我在输出中得到了这个:- 经过大量调试,我知道我发送 dateFrom 和 dateTo 的方式不正确。 正确的方法是 dateFrom._ 和 dateTo._。但这应该在 Azure Table 或 OData Query 中提及,但那里没有。根据 Odata Docs link 查询比较运算符,比较运算符两侧的数据类型必须兼容。
这会造成混淆,因为即使两者的类型相同也会出错。正确的代码如下:-
let res: IQueryPrePostAuthResponse[] = [];
let query = new TableQuery();
query = query.where('PartitionKey eq ?', searchQuery.user_id);
const entGen = TableUtilities.entityGenerator;
const dateFrom = entGen.DateTime(new Date(searchQuery.date_from));
const dateTo = entGen.DateTime(new Date(searchQuery.date_to));
query = query.and(
'Timestamp >= ? and Timestamp <= ?',
dateFrom._,
dateTo._,
);
现在我可以根据 Timestamp 属性从 Azure 表中查询实体。
【讨论】:
以上是关于找到运算符类型“GreaterThanOrEqual”的操作数类型“Edm.DateTime”和“Edm.String”的主要内容,如果未能解决你的问题,请参考以下文章
检测到类型不兼容的二元运算符。找到类型相等的操作数类型 edm.string 和 edm.guid
无法在具有自定义运算符 ==() 的 c++ 无序集中找到用户定义的类型
错误:二进制“<<”:未找到采用“std::string”类型的右侧操作数的运算符 [重复]