Linq查询帮助需要

时间:2010-05-21 13:01:01

标签: c# linq

说我有以下LINQ查询:

var source = from workflow in sourceWorkflowList
             select new { SubID = workflow.SubID,
                          ReadTime = workflow.ReadTime,
                          ProcessID = workflow.ProcessID,
                          LineID = workflow.LineID };

var target = from workflow in targetWorkflowList
             select new { SubID = workflow.SubID,
                          ReadTime = workflow.ReadTime,
                          ProcessID = workflow.ProcessID,
                          LineID = workflow.LineID };

var difference = source.Except(target);

sourceWorkflowListtargetWorkflowList具有完全相同的列定义。但是它们都包含比上面查询中显示的更多的数据列。这些只是这个特定问题所需的列。

difference包含sourceWorkflowList中未包含在targetWorkflowList

中的所有行

现在我想要删除sourceWorkflowListdifference中不存在的{{1}}行。有人可以给我一个查询吗?

非常感谢 - 兰迪

3 个答案:

答案 0 :(得分:2)

你真正想要的是源中的内容而不是(源中的内容而不是目标中的内容):S(S \ T)= S CUT T

var result = from sourceWorkflow in sourceWorkflowList
             join targetWorflow in targetWorkflowList on
                 new {sourceWorkflow.SubID, sourceWorkflow.ReadTime, sourceWorkflow.ProcessID, sourceWorkflow.LineID}
                 equals
                 new {targetWorflow.SubID, targetWorflow.ReadTime, targetWorflow.ProcessID, targetWorflow.LineID}
             select sourceWorkflow;

以不同的形式(但这只会给你4列):

var result = sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID})
    .Intersect(sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID}));

答案 1 :(得分:1)

假设您使用的是List<T>

sourceWorkflowList.RemoveAll(
    workflow => difference.Contains(
                    new { 
                             SubID = workflow.SubID,
                             ReadTime = workflow.ReadTime,
                             ProcessID = workflow.ProcessID,
                             LineID = workflow.LineID 
                         }));

格式化道歉...

答案 2 :(得分:1)

如果你有一个约束要求你只在原始容器中进行更改,请执行@ rob-fonseca-ensor建议的删除,

如果差异列表很大,请考虑将其转换为HashSet()以首先获得快速查找。

...否则

如果您可以更改差异的方式,请使用@brickner建议的连接/交叉选项,因为这样可以防止列表的多次迭代。

如果新集合可以接受,但您已经有差异(无法替换生成它的代码):

var changedSource = source.Except(difference);