如何使用linq从另一个列表中筛选一个列表

时间:2017-07-12 09:11:22

标签: c# linq

我编写了以下查询来过滤查询。

我使用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中。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,filter.Idsx.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的每个元素,其中Entity2filter.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