我想查询客户的所有发票。 SDK有一些LinqExtender扩展程序,因此可以认为您可以做(例如客户ID' 1'映射到现有客户):
CreateQueryService<IppData.Invoice>().Where(x => x.CustomerRef.Value = "1")
但是,这会生成以下SQL:
Select * FROM Invoice WHERE CustomerRef.Value = '1'
这是禁区:
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-08-24T13:41:04.367-07:00">
<Fault type="ValidationFault">
<Error code="4001">
<Message>Invalid query</Message>
<Detail>QueryValidationError: Property CustomerRef.Value not found for Entity Invoice</Detail>
</Error>
</Fault>
</IntuitResponse>
正确的SQL会读取:
Select * FROM Invoice WHERE CustomerRef = '1'
当然直接使用SQL并创建动态查询(eww)有效,但我希望有更好的方法。我喜欢Linq扩展的可读性和(希望)类型安全的好处,并且你认为这将是一件很常见的事情。不幸的是,文档是一个巨大的迷宫,严重缺乏任何有用的例子,所以:有没有人知道如何做到这一点,还是我们坚持使用字符串SQL?
答案 0 :(得分:1)
是的,SDK具有Linq扩展程序扩展,但这没有按预期工作。 我为此提出了一个错误。 不幸的是,您必须使用常规查询操作。
答案 1 :(得分:1)
我使用不同的库,但使用CustomerRef作为字段,ID作为字符串最终正常工作。文档在这个
上并不是很清楚{{1}}
答案 2 :(得分:0)
使用java,我完成了它并且它的工作正常一切:
String query = select($(invoice))
.where($(invoice.getCustomerRef().getClass().toGenericString()).eq("2"))
.where($(invoice.getMetaData().getCreateTime()).gte(calendarStart.getTime()))
.where($(invoice.getMetaData().getCreateTime()).lte(calendarEnd.getTime()))
.skip(0).take(10).generate();
QueryResult queryResultpage = service.executeQuery(query);