需要比较两个集合,然后添加或删除 DBAName

Need to compare two collections and then either add or remove the DBAName

在 entity framework 和 Web API2 中,我有一个接收 LegalEntity 模型 legalEnt 的 PUT。 LegalEntity 模型有一组 DBAName。我需要将 legalEnt 提供的所有 DBAName 对象与我从 LegalEntityID 匹配的数据库中获取的名为 dba 的 DBANames 集合进行比较。

如果来自 UI 作为 LegalEnt 的 DBANames 集合与数据库中的集合相比缺少 DBAName,那么我需要从数据库中删除缺少的 DBAName。此外,如果 UI 中有一个额外的 DBAName,那么我需要添加该 DBAName。

我不太关心我的语法,因为我关心的是识别丢失或额外的 DBAName 然后将其删除的逻辑。对我来说,这是一个逻辑练习。我在想我需要遍历每个集合,然后将对象放入要添加或删除的数组中(addArray 和 delArray)。但是如何做到这一点对我来说并不是很明显。

public IHttpActionResult Put(LegalEntity legalEnt)
{        
        List<DBAName> dba = new List<DBAName>();
        dba = db.DBAName.Where(d => d.LegalEntityID == legalEnt.LegalEntityID).ToList();

        foreach(var legal in legalEnt.DBANames)
        {
            foreach(var d in dba)
            {
                do something
            }
            maybe do something else
        }
}

为了使您的代码简短,您可以按如下方式使用 Linq:

public IHttpActionResult Put(LegalEntity legalEnt)
{        
    List<DBAName> dba = new List<DBAName>();
    dba = db.DBAName.Where(d => d.LegalEntityID == legalEnt.LegalEntityID).ToList();

    var addArray = legalEnt.DBANames.Where(x => !dba.Select(y => y.LegalEntityID).Contains(x.LegalEntityID)).ToArray();
    var delArray = dba.Where(x => !legalEnt.DBANames.Select(y => y.LegalEntityID).Contains(x.LegalEntityID)).ToArray();
}

另一种方法是这样的:

public IHttpActionResult Put(LegalEntity legalEnt)
{        
    List<DBAName> dba = new List<DBAName>();
    dba = db.DBAName.Where(d => d.LegalEntityID == legalEnt.LegalEntityID).ToList();

    var addArray = legalEnt.DBANames.Select(x => x.LegalEntityID).Except(dba.Select(y => y.LegalEntityID)).ToList();
    var delArray = dba.Select(x => x.LegalEntityID).Except(legalEnt.DBANames.Select(y => y.LegalEntityID)).ToList();
}

这样你会得到一个int列表。


最后一种方法是在两个列表之间使用 Except 方法。基本上你的 DBAName class 应该实现 IEquatable<DBAName> 让框架知道如何比较实体。

如有兴趣,请查看更多文档here


反正我还是会选择第一种方法:)