在实体框架和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
}
}
答案 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。
无论如何,我会选择第一种方法:)