首页 > 解决方案 > 确定 ICollection 中的所有项目是否不包含在列表中使用 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);

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

谢谢

标签: c#entity-frameworklinq

解决方案


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

!OptionList.Contains(option)

或者如果不是这样:

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

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

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

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


推荐阅读