【问题标题】:Need to compare two collections and then either add or remove the DBAName需要比较两个集合,然后添加或删除 DBAName
【发布时间】:2015-11-26 13:16:31
【问题描述】:

在实体框架和 Web API2 中,我有一个接收 LegalEntity 模型 legalEnt 的 PUT。 LegalEntity 模型有一个 DBANames 集合。我需要将 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
        }
}

【问题讨论】:

    标签: c# performance linq lambda logic


    【解决方案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&lt;DBAName&gt; 让框架知道如何比较实体。

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


    不管怎样,我还是会选择第一种方法:)

    【讨论】:

    • 我使用了您的数组,但只是将 addArray 更改为 .Contains(x.Names)).ToArray();因为 Names 是描述字符串,我将 delArray 更改为 .Contains(x.DBANameID)*).ToArray();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2018-09-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多