找到运算符类型“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】:

当我在发送查询之前打印 dateTodateFrom

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

我在输出中得到了这个:- 经过大量调试,我知道我发送 dateFromdateTo 的方式不正确。 正确的方法是 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”类型的右侧操作数的运算符 [重复]

使用运算符 << >> 的 CArchive 序列化未找到采用 cArchive 类型的左手的运算符

错误 C2679:二进制“<<”:未找到采用“std::string”类型右侧操作数的运算符(或没有可接受的转换)