azure 找到运算符类型“GreaterThanOrEqual”的操作数类型“Edm.DateTime”和“Edm.String”

wwwo4jvm  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(94)

尝试基于类型为Edm.DateTimeTimestamp从Azure表获取实体时出错:

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是DateTime类型。根据Odata类型link查询比较运算符,比较运算符两边的数据类型必须兼容。这是我的情况都是一样的,然后我得到一个错误。

bpsygsoo

bpsygsoo1#

在发送给query之前打印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);

我在输出中得到了这个:-x1c 0d1x经过多次调试,我知道我发送dateFromdateTo的方式不正确。
正确的方法是dateFrom.dateTo.。但这应该在Azure表或OData查询中提到,但它不在那里。

  • 根据Odata查询比较运算符,比较运算符两边的数据类型必须兼容。*

这是造成混乱,因为得到错误,即使两者的类型是相同的。正确的代码如下:

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表中查询实体了。

zy1mlcev

zy1mlcev2#

按日期字段筛选时,不要将日期值放在引号中。
这是错误的:

http://localhost:7048/XX/ODataV4/PostedSalesInvoice?Posting_Date&%24filter=Posting_Date+ge+'2023-01-01'&%24format=json

这是正确的:

http://localhost:7048/XX/ODataV4/PostedSalesInvoice?Posting_Date&%24filter=Posting_Date+ge+2023-01-01&%24format=json

相关问题