Xero api 按联系人 ID 查询发票时不返回值
Xero api not returning values when querying invoices by contact Id
我需要通过联系人 ID 获取联系人的发票,因此我编写了类似于 Qusery 3(用于付款)的查询 1。我的 objective 是从属于它的关联对象联系人的字段中查询发票。但是查询 1 returns 0 个结果。
然后我尝试了我查询发票的方式,通过属于发票的字段进行查询。我指的是 GitHub 中的 Xero C# 代码示例。它正在运行,returns 10 个结果符合预期。
为什么我无法从属于发票中联系人的 ContactId 字段中查询?
代码
查询 1(不工作 - Return 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();
在您的 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 的发票。
对于如何在查询 1 中查找联系人以及如何在查询 3 中查找付款,您也可以做类似的事情。
还值得注意的是,您最多只能返回 100 条记录,因为默认情况下包装器会分页发票。如果您希望返回超过 100 条记录,您将需要循环浏览页面,直到您不再收到任何更多记录,方法是在 .Find() 之前提供 .Page(x) 方法,其中 x 是您想要的页码。
这就是为什么您的 Query3 有效而您的 Query1 无效的原因。付款端点在 Xero 的 API 中尚不支持分页,因此您正在连接的组织中接收所有付款,因此在客户端进行过滤会很好,但对于 Query1,您只会收到 100 张发票(因为分页)和 none 它们将匹配您的客户端 Linq.Where。
干杯,
马特
我需要通过联系人 ID 获取联系人的发票,因此我编写了类似于 Qusery 3(用于付款)的查询 1。我的 objective 是从属于它的关联对象联系人的字段中查询发票。但是查询 1 returns 0 个结果。
然后我尝试了我查询发票的方式,通过属于发票的字段进行查询。我指的是 GitHub 中的 Xero C# 代码示例。它正在运行,returns 10 个结果符合预期。
为什么我无法从属于发票中联系人的 ContactId 字段中查询?
代码
查询 1(不工作 - Return 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();
在您的 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 的发票。
对于如何在查询 1 中查找联系人以及如何在查询 3 中查找付款,您也可以做类似的事情。
还值得注意的是,您最多只能返回 100 条记录,因为默认情况下包装器会分页发票。如果您希望返回超过 100 条记录,您将需要循环浏览页面,直到您不再收到任何更多记录,方法是在 .Find() 之前提供 .Page(x) 方法,其中 x 是您想要的页码。
这就是为什么您的 Query3 有效而您的 Query1 无效的原因。付款端点在 Xero 的 API 中尚不支持分页,因此您正在连接的组织中接收所有付款,因此在客户端进行过滤会很好,但对于 Query1,您只会收到 100 张发票(因为分页)和 none 它们将匹配您的客户端 Linq.Where。
干杯,
马特