C# 需要Linq查询帮助

C# 需要Linq查询帮助,c#,linq,C#,Linq,假设我有以下LINQ查询: var source = from workflow in sourceWorkflowList select new { SubID = workflow.SubID, ReadTime = workflow.ReadTime, ProcessID = workflow.ProcessID,

假设我有以下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);
sourceWorkflowList
targetWorkflowList
具有完全相同的列定义。但是它们都包含比上面查询中显示的更多的数据列。这些正是本期所需的专栏

差异
包含
源工作流列表
中未包含在
目标工作流列表中的所有行

现在我想做的是从
sourceWorkflowList
中删除
difference
中不存在的所有行。有人能给我一个可以这样做的查询吗


非常感谢-Randy

您真正想要的是源代码中的内容而不是(源代码中的内容而不是目标中的内容):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列):


您实际需要的是源中的内容而不是(源中的内容而不是目标中的内容):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列):


假设您使用的是
列表


抱歉格式化…

假设您使用的是
列表


抱歉格式化…

如果您有一个限制,要求您只在原始容器中进行更改,请按照@rob fonseca ensor的建议进行删除

如果差异列表较大,请考虑将其转换为哈希集()以获得快速查找。 否则

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

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


如果您有一个约束要求您仅在原始容器中进行更改,请按照@rob fonseca ensor的建议进行删除

如果差异列表较大,请考虑将其转换为哈希集()以获得快速查找。 否则

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

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


查询中的某个值是否为唯一记录id?@Matthew-No。但是,SubID+ReadTime+ProcessID+LineID共同构成基础数据库表中的唯一键。查询中的某个值是否为唯一记录id?@Matthew-No。但是,SubID+ReadTime+ProcessID+LineID一起构成了基础数据库表中的唯一键。只使用Intersect不是更容易吗@罗布·丰塞卡·恩索尔:正确。我已经在答案中添加了这个。@Brickner-这很接近。是的,我想要的是源代码中不在目标代码中的内容,但我只想对我的原始帖子中显示的四列进行比较。表中还有三列我不想用于比较。@Brickner-我要找的是您的第一个查询。但是,请记住,我需要源中所有不在目标中的行。您提供的查询将源连接到目标,因此我只获取两者中的行。@Randy Minder,您在问题中询问了源中所有没有差异的行。这就是交叉点。使用交叉点不是更容易吗@罗布·丰塞卡·恩索尔:正确。我已经在答案中添加了这个。@Brickner-这很接近。是的,我想要的是源代码中不在目标代码中的内容,但我只想对我的原始帖子中显示的四列进行比较。表中还有三列我不想用于比较。@Brickner-我要找的是您的第一个查询。但是,请记住,我需要源中所有不在目标中的行。您提供的查询将源连接到目标,因此我只获取两者中的行。@Randy Minder,您在问题中询问了源中所有没有差异的行。那是十字路口。
sourceWorkflowList.RemoveAll(
    workflow => difference.Contains(
                    new { 
                             SubID = workflow.SubID,
                             ReadTime = workflow.ReadTime,
                             ProcessID = workflow.ProcessID,
                             LineID = workflow.LineID 
                         }));
var changedSource = source.Except(difference);