【问题标题】:Xero api not returning values when querying invoices by contact Id通过联系人 ID 查询发票时,Xero api 不返回值
【发布时间】:2015-12-16 22:42:01
【问题描述】:

我需要按联系人 ID 获取联系人的发票,因此我编写了类似于 Qusery 3(用于付款)的查询 1。我的目标是从属于它的关联对象联系人的字段中查询发票。但是查询 1 返回 0 个结果。

然后我尝试了查询发票的方式,通过属于发票的字段进行查询。我指的是 GitHub 中的 Xero C# 代码示例。它正在工作并按预期返回 10 个结果。

为什么我不能从ContactId字段查询属于发票中的联系人?

代码

查询 1(不工作 - 返回 0 个结果,期望 10 个结果)

 var contact = _api.Contacts.Find().FirstOrDefault(c => c.AccountNumber == accountNumber);
            returnInvoiceList =
                _api.Invoices.Find()
                    .Where(c => c.Contact.Id == contact.Id)
                    .OrderBy(item => typeof(Invoice).GetProperty(
                        orderby, BindingFlags.Public | BindingFlags.Instance).GetValue(item))
                    .Skip(i * x)
                    .Take(x)
                    .ToList();

问题 2(工作中)

returnInvoiceList =
                    _api.Invoices.Where(string.Format("Reference == \"{0}\"", accountNumber)).Find()
                        .OrderBy(item => typeof(Invoice).GetProperty(
                            orderby, BindingFlags.Public | BindingFlags.Instance).GetValue(item))
                        .Skip(i * x)
                        .Take(x)
                        .ToList();

QUERY 3(与查询 1 类似的模式查询,用于支付)

 returnPaymentList =
                   _api.Payments.Find()
                       .Where(c => c.Invoice.Contact.Id == contact.Id)
                       .OrderBy(item => typeof(Payment).GetProperty(
                           orderby, BindingFlags.Public | BindingFlags.Instance).GetValue(item))
                       .Skip(i * x)
                       .Take(x)
                       .ToList();

【问题讨论】:

  • 如果删除查询中的Find() 会怎样? Where 已经成功了
  • 不。它给你一个编译错误。当您尝试使用 lambda 表达式时,Xero 需要 Find before Where。当 where 子句为字符串格式时,可以接受 Where("where string").Find()。这些是 api 要求。

标签: c# xero-api


【解决方案1】:

在您的 Query1 中,您使用的是 Linq .Where 而不是包装器的开放式 .Where 子句。使用 Linq .Where 将在客户端执行过滤。使用开放式包装器 .Where 子句将允许在服务器端进行过滤,这意味着您只会收到与您的查询匹配的发票。

我建议您尝试替换这部分查询

_api.Invoices
    .Find()
    .Where(c => c.Contact.Id == contact.Id)

_api.Invoices
    .Where("Contact.ContactID == Guid(\"" + contact.Id +"\")")
    .Find()  

利用服务器端过滤来确保您只会收到具有正确联系 ID 的发票。

在查询 1 中如何查找联系人以及如何在查询 3 中查找付款方面,您可能也值得做类似的事情。

还值得注意的是,您最多只能返回 100 条记录,因为默认情况下包装器会分页发票。如果您希望返回超过 100 条记录,您将需要遍历页面,直到您不再收到更多记录,方法是在 .Find() 之前提供方法 .Page(x) ,其中 x 是您想要的页码。

这就是为什么您的 Query3 有效而您的 Query1 无效的原因。 Payments 端点在 Xero 的 API 中尚不支持分页,因此您在连接的组织中接收所有付款,因此在客户端进行过滤就可以了,但对于 Query1,您只会收到 100 张发票(因为分页) 并且它们都不会与您的客户端 Linq .Where 匹配。

干杯,

马特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多