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

时间:2015-12-16 22:42:02

标签: c# xero-api

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

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

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

代码

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

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

1 个答案:

答案 0 :(得分:3)

在你的Query1中,看起来你正在使用Linq。而不是包装器的开放式.Where子句。使用Linq。将在客户端执行过滤。使用包装器打开已结束.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匹配。所以。

干杯,

马特