当前位置:  开发笔记 > 编程语言 > 正文

通过联系人ID查询发票时,Xero API不返回值

如何解决《通过联系人ID查询发票时,XeroAPI不返回值》经验,为你挑选了1个好方法。

我需要通过联系人ID获取联系人的发票,因此我编写了类似于Qusery 3(用于付款)的查询1。我的目标是从与它关联的对象Contact所属的字段查询发票。但是查询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();

查询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();

MJMortimer.. 5

在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()  

利用服务器端过滤来确保仅收到具有正确contactID的发票。

您在Query1中如何找到联系人以及在Query3中如何找到付款也可能需要您做一些类似的事情。

还值得注意的是,由于默认情况下包装程序将分页发票,因此您最多只能检索100条记录。如果您希望取回100条以上的记录,则可以通过在.Find()之前提供.Page(x)方法(其中x是所需的页码)来遍历页面,直到不再收到更多记录。

这就是为什么Query3有效但Query1无效的原因。Payments端点尚不支持Xero API中的分页,因此您正在接收连接的组织中的所有付款,因此在客户端进行过滤会很好,但是对于Query1,您将仅接收100张发票(由于分页) ),它们都不会与您的客户端Linq相匹配。

干杯,

马特



1> MJMortimer..:

在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()  

利用服务器端过滤来确保仅收到具有正确contactID的发票。

您在Query1中如何找到联系人以及在Query3中如何找到付款也可能需要您做一些类似的事情。

还值得注意的是,由于默认情况下包装程序将分页发票,因此您最多只能检索100条记录。如果您希望取回100条以上的记录,则可以通过在.Find()之前提供.Page(x)方法(其中x是所需的页码)来遍历页面,直到不再收到更多记录。

这就是为什么Query3有效但Query1无效的原因。Payments端点尚不支持Xero API中的分页,因此您正在接收连接的组织中的所有付款,因此在客户端进行过滤会很好,但是对于Query1,您将仅接收100张发票(由于分页) ),它们都不会与您的客户端Linq相匹配。

干杯,

马特

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有