LINQ比较多个属性上的两个集合

时间:2016-03-31 15:26:50

标签: c# linq

有两个集合: NodesWithCircuitsDown<NetworkDeviceNodeStatus>RecordedImpairedNodes<NetworkDeviceNodeStatus>

NetworkDeviceNodeStatusNodeId(int)和CurrentStatus(枚举)。

我想创建一个名为NodesWithDifferentImpairment的第三个集合,其中包含NetworkDeviceNodeStatus的{​​{1}}个NodeId集合,但上面有两个集合,但CurrentStatus表示{不同。

以下是我目前的情况,但是我无法嵌套查询来完成此任务。

IEnumerable<NetworkDeviceNodeStatus> NodesWithDifferentImpairment =
                NodesWithCircuitsDown.Where(x => 
                    RecordedImpairedNodes.Select(y => new { y.CurrentStatus, y.NodeId }).Select(y => y.NodeId)
            );

2 个答案:

答案 0 :(得分:3)

试试这个

NodesWithCircuitsDown.Join(RecordedImpairedNodes, 
  node => node.NodeId,
  node => node.NodeId,
  (leftNode, rightNode) => new { LeftNode = leftNode, RightNode = rightNode }).
  Where(pair => pair.LeftNode.CurrentStatus != pair.RightNode.CurrentStatus);

通过连接NodeId属性上的两个集合来获取具有不同状态的节点对,提取这些对并过滤那些具有不同状态的节点。

答案 1 :(得分:2)

您必须加入它们然后过滤:

var NodesWithDifferentImpairment  = from nwcd in NodesWithCircuitsDown
                                    join rin in RecordedImpairedNodes on nwcd.NodId equals rin.NodeId
                                    where rin.CurrentStatus != nwcd.CurrentStatus
                                    select new  NetworkDeviceNodeStatus
                                           {
                                             CurrentStatus = rin.CurrentStatus,
                                             NodeId =  rin.NodeId

                                           };