我编写了以下查询来过滤查询。
我使用Entity2
导致我之前没有注意到的问题,因为query = query.Where(x => filter.Ids.Contains(x.Entity2.Select(y => y.testId).First()));
也是一个集合。它只过滤第一个Id。
<template id="account_invoice_report_document_tax_table_ept" inherit_id="account.report_invoice_document">
<xpath expr="//div[@t-if='o.tax_line_ids']" position="replace">
</xpath>
<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">
<div t-if="o.tax_line_ids">
<div class="col-xs-6">
<table class="table table-condensed">
<thead>
<tr>
<th>Tax</th>
<th class="text-right">Base</th>
<th class="text-right">Amount</th>
</tr>
</thead>
<tbody>
<tr t-foreach="o.tax_line_ids" t-as="t">
<td><span t-field="t.name"/></td>
<td class="text-right">
<span t-field="t.base"
t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
<td class="text-right">
<span t-field="t.amount"
t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</xpath>
</template>
请建议我如何使用contains来检查Entity2的所有testId属性?
基本上x.Entity2.Select(y =&gt; y.testId)是我想要的ID列表 检查它们是否包含在filter.Ids中。
答案 0 :(得分:2)
如果我理解正确,filter.Ids
和x.Entity2.Select(y => y.testId)
都是ID列表,并且您希望确保来自x.Entity2
的所有ID都在filter.Ids
中。在这种情况下,您需要以下内容:
var result = query.Where(x => x.Entity2.Count(y => filter.Ids.Contains(y.testId)) == x.Entity2.Count);
我们在这里做的是我们正在计算query
的每个元素,其中Entity2
和filter.Ids
中的ID数。如果该数字等于Entity2
中的Ids总数,那么我们会在结果中包含该数字。
答案 1 :(得分:0)
对于您的上述查询,您还可以使用Any()
和Contains()
两者,它可以正常工作
根据你的过滤器是集合,其中有Ids和Entity2都是集合,所以假设我写了这个,
query = query.Where(x => filter.Where(a=> a.Entity2.Any(y=> a.Ids.Contains(y.testId));
但在您的查询中,您也可以删除First()
并使用ToList()
,但如果数据很大,则会抛出OutofMemoryException
。