LINQ 等于而不是包含

Posted

技术标签:

【中文标题】LINQ 等于而不是包含【英文标题】:LINQ equal instead of Contains 【发布时间】:2017-09-05 11:57:31 【问题描述】:

我需要使用 equal 而不是 Contains。 我有一个名为 selectedDeviceTypeIDs 的代码数组,我假设它有两个代码 1,2

如果设备 ID 正好是 1,2,我需要从查询中获取结果,所以我已将 selectedDeviceTypeIDs.Contains 替换为 selectedDeviceTypeIDs.equal 或类似的东西......

m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)

if (DeviceTypeIDs != null)

    Guid[] selectedDeviceTypeIDs = DeviceTypeIDs.Split(',').Select(Guid.Parse).ToArray();
    query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units.Any(m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)))));

【问题讨论】:

为什么不使用循环并检查相等的数据? @Bharat 因为这需要将整个数据集放入内存中,这对我来说就像一个实体框架查询。 我通常用 0 来测试不等于,这意味着一切都匹配。也使用 Where((x,i) => .... 像这样 Where((j,i) => (j.HospitalDepartments != selectedDeviceTypeIDs[i])).Count == 0 @Bharat,谢谢您的帮助 :) 如果 m => m.Devices 具有 selectedDeviceTypesIDs 数组中的确切 ID,我需要检查数据库问题如何存档,因为 Devices.DeviceID 是一个对象不是数组来检查它是否与 selectedDeviceTypesIDs 数组相等 @DavidG,谢谢你的帮助 :) 我需要检查数据库,如果 m => m.Devices 在 selectedDeviceTypesIDs 数组中有确切的 ids 问题如何存档,因为 Devices.DeviceID 是一个对象不是数组来检查它是否与 selectedDeviceTypesIDs 数组相等 【参考方案1】:

使用 !.Except().Any() 确保 m.Devices 不包含任何 DeviceTypeID 不存在于 selectedDeviceTypeIDs

query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units
.Where(m => !m.Devices.Select(w => w.DeviceTypeID).Except(selectedDeviceTypeIDs).Any())));

【讨论】:

亲爱的Innat3,非常感谢您的帮助和努力...我实际上尝试了您的代码,但它不起作用...但可能是因为我们使用了两次...我如果您再次查看代码,我确定它会起作用,再次感谢您 Innat3 如果您很忙,我很抱歉【参考方案2】:

选项 1:

如果您关心项目的顺序,请使用SequenceEqual 扩展方法。这将返回 false,即使集合中有项目但顺序不同

m => m.Devices.Any(w => selectedDeviceTypeIDs.SequenceEqual(w.DeviceTypeID)

选项 2:

如果您不关心订单,请使用All 扩展方法。如果两个集合中的项目相同而不管顺序如何,这将返回 true。

m => m.Devices.Any(w => selectedDeviceTypeIDs.All(w.DeviceTypeID.Contains)

【讨论】:

Ranjith V. 非常感谢您的帮助...我尝试了上面的代码...它给了我错误,因为 w.DeviceTypeID 是一个属性而不是数组,我无法与之比较selectedDeviceTypeIDs 我想我需要获取 w.DeviceTypeID 的列表,然后将其与 selectedDeviceTypeIDs 进行比较...你能帮我解决它吗img【参考方案3】:

您需要检查selectedDeviceTypeIDs 是否包含所有设备,以及每个设备是否包含selectedDeviceTypeIDs。你可以使用这个:

query = query
.Where(j =>
    j.HospitalDepartments.Any(jj =>
        jj.Units.Any(m =>
            m.Devices.All(
                w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID))
            &&
            selectedDeviceTypeIDs.All(
                g => m.Devices.Select(d => d.DeviceTypeID).Contains(g))
        )
    )
);

【讨论】:

granit,我编辑了问题并解决了它。非常感谢您的帮助和努力:) @Alex 您使用我的答案中的代码和您在更新后的问题中写的代码不会得到相同的结果吗?

以上是关于LINQ 等于而不是包含的主要内容,如果未能解决你的问题,请参考以下文章

linq 连接中是不是存在“不等于”

linq 连接中是不是存在“不相等”? [复制]

使用 LINQ 检查字符串是不是包含字符串或字符列表

JQuery包含vs等于[重复]

如何使用 Linq where 条件检查字符串列表是不是包含任何字符串

在 Linq 中,如何在不使用 Count(predicate) 的情况下查找集合是不是包含元素?