使用Linq查询确定ICollection <t>中的所有项目是否不包含在List <t>中

时间:2018-10-03 19:53:53

标签: c# entity-framework linq

这就是设置:

规则模型

public class Rule
{
    public int RuleId { get; set; }
    public BillOfMaterial BillOfMaterial { get; set; }
    public ICollection<Option> MustNotContainAllOptions { get; set; }
}

选项模型

public class Option
{
    public int OptionId { get; set; }
    public string OptionCode { get; set; }
    public ICollection<Rule> MustNotContainAllRules { get; set; }
}

我正在尝试从给定的基准和选项列表中查询其物料清单的规则。此时唯一的条件是该规则不能包含任何给定的选项列表。

示例输入

输入选项:PA,PB

示例规则

规则:MustNotContainOptions = PA,物料清单= BOM1

在这种情况下,查询应不返回任何内容,因为输入具有选项PA

我尝试过的事情

OptionList =选项的输入列表

   var MustNotContainAnyQuery = (from rule in db.Rules
                                 where rule.MustNotContainAllOptions.Any(option => !OptionList.Contains(option.OptionCode))
                                 select rule.BillOfMaterial.BomNumber);

var MustNotContainAnyQuery = (from rule in db.Rules
                              where rule.MustNotContainAllOptions.All(option => !OptionList.Contains(option.OptionCode))
                              select rule.BillOfMaterial.BomNumber);

我似乎无法将其锁定。如果有人可以解释我在做什么错,那将是很大的帮助。

谢谢

1 个答案:

答案 0 :(得分:2)

如果OptionList是选项列表,则包含将不适用于选项代码。 如果它们是相同的引用或正确实现的值类型,则可以这样做:

!OptionList.Contains(option)

或者如果不是这样的话

!OptionList.Any(opt => opt.OptionCode == option.OptionCode)

您的第一个查询是错误的,您可以将其更改为此...

where !rule.MustNotContainAllOptions.Any(option => OptionList

或使用您的第二个查询,这是正确的