需要比较两个集合,然后添加或删除 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。
反正我还是会选择第一种方法:)
在 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。
反正我还是会选择第一种方法:)