2017-04-10 91 views
0

我需要使用equal而不是Contains。 我有一个名为selectedDeviceTypeIDs码的数组我认为它有两个代码{1,2}LINQ等于包含

我需要得到查询结果,如果设备的标识是完全{1,2},所以我必须更换selectedDeviceTypeIDs selectedDeviceTypeIDs.Contains .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))))); 
} 
+0

你为什么不使用循环并检查相等的数据? – Bharat

+0

@Bharat因为这需要将整个数据集放入内存中,这看起来像是一个实体框架查询。 – DavidG

+0

我通常测试不等于0的计数,这意味着一切都匹配。同样使用Where((x,i)=> ....类似于这里Where((j,i)=>(j.HospitalDepartments!= selectedDeviceTypeIDs [i]))。Count == 0 – jdweng

回答

0

选项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) 
+0

Ranjith V. 非常感谢您的帮助...我试过上面的代码...它给了我错误,因为w.DeviceTypeID是一个属性而不是数组,我无法将它与selectedDeviceTypeIDs进行比较,我想我需要得到一个w.DeviceTypeID的列表,然后将它与selectedDeviceTypeIDs进行比较...你能帮我解决它 [img] – Alex

0

使用!。除()。任何()确保m.Devices不包含任何DeviceTypeIDselectedDeviceTypeIDs

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

Dear Innat3, I会非常感谢你的帮助和努力......我实际上已经尝试过你的代码,但它不工作......但也许是因为我们使用了两次...我相信如果你再次看看代码,它会工作,再次感谢你 – Alex

+0

Innat3我很抱歉,如果你很忙 – Alex

0

你需要不存在检查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)) 
     ) 
    ) 
); 
+0

granit,我编辑了问题,并解决它。谢谢你的帮助和努力:) – Alex

+0

@Alex通过使用我的答案中的代码和您在更新后的问题中编写的代码可以获得相同的结果吗? – granit