我需要通过联系人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相匹配。
干杯,
马特
在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相匹配。
干杯,
马特