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

时间:2015-11-26 13:16:31

标签: c# performance linq lambda logic

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

如果来自UI的DBANames集合作为LegalEnt,与数据库中的集合相比缺少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
        }
}

1 个答案:

答案 0 :(得分:1)

为了简化您的代码,您可以按如下方式使用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类应该实现IEquatable<DBAName>,让框架知道如何比较实体。

如果您有兴趣,请参阅更多文档here

无论如何,我会选择第一种方法:)