簡體   English   中英

Linq查詢幫助需要

[英]Linq Query Help Needed

假設我有以下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中的所有行

現在我想要做的是從sourceWorkflowList中刪除不存在difference所有行。 有人能告訴我一個可以做到這一點的查詢嗎?

非常感謝 - 蘭迪

你真正想要的是源中的內容而不是(源中有什么而不​​是目標):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}));

假設您正在使用List<T>

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

抱歉格式化......

如果您有一個約束,要求您只在原始容器中進行更改,請執行@ rob-fonseca-ensor建議的刪除,

如果差異列表很大,請考慮將其轉換為HashSet()以首先獲得快速查找。

除此以外...

如果您可以改變獲得差異的方式,請使用@brickner建議的連接/交叉選項,因為這可以防止列表的多次迭代。

如果新集合是可接受的但您已經有差異 (無法替換生成它的代碼):

var changedSource = source.Except(difference);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM