我有一个实体集国家/地区,在我的数据库中反映了数据库表’<’char(2),char(3),nvarchar(50>)。
我有一个解析器,它返回一个已解析国家的Country []数组,并且在以正确的方式更新它时遇到了问题。我想要的是:以国家/地区为数组,为那些尚未在数据库中的国家/地区插入它们,以及那些现有的更新(如果有任何字段不同)。如何才能做到这一点?
void Method(object sender, DocumentLoadedEvent e) { var data = e.ParsedData as Country[]; using(var db = new DataContractEntities) { //Code missing } }
我在想类似
for(var c in data.Except(db.Countries)) but it wount work as it compares on wronge fields.
希望任何人以前都有过此问题,并为我找到了解决方案。如果我不能使用Country对象并轻松地插入/更新它们的数组,那么我看不到使用框架的好处,因为从表演者的角度来看,我认为编写自定义sql脚本插入该对象的速度更快,而不是检查一个国家/地区插入之前已经在数据库中了吗?
我在我的国家/地区类别中添加了覆盖等于:
public partial class Country { public override bool Equals(object obj) { if (obj is Country) { var country = obj as Country; return this.CountryTreeLetter.Equals(country.CountryTreeLetter); } return false; } public override int GetHashCode() { int hash = 13; hash = hash * 7 + (int)CountryTreeLetter[0]; hash = hash * 7 + (int)CountryTreeLetter[1]; hash = hash * 7 + (int)CountryTreeLetter[2]; return hash; } }
然后执行:
var data = e.ParsedData as Country[]; using (var db = new entities()) { foreach (var item in data.Except(db.Countries)) { db.AddToCountries(item); } db.SaveChanges(); }
我会简单地做到这一点:
void Method(object sender, DocumentLoadedEvent e) { var data = e.ParsedData as Country[]; using(var db = new DataContractEntities) { foreach(var country in data) { var countryInDb = db.Countries .Where(c => c.Name == country.Name) // or whatever your key is .SingleOrDefault(); if (countryInDb != null) db.Countries.ApplyCurrentValues(country); else db.Countries.AddObject(country); } db.SaveChanges(); } }
我不知道您的应用程序必须多久运行一次,或者您的世界有多少个国家。但是我有种感觉,您不必考虑复杂的性能优化。
编辑
仅发出一个查询的替代方法:
void Method(object sender, DocumentLoadedEvent e) { var data = e.ParsedData as Country[]; using(var db = new DataContractEntities) { var names = data.Select(c => c.Name); var countriesInDb = db.Countries .Where(c => names.Contains(c.Name)) .ToList(); // single DB query foreach(var country in data) { var countryInDb = countriesInDb .SingleOrDefault(c => c.Name == country.Name); // runs in memory if (countryInDb != null) db.Countries.ApplyCurrentValues(country); else db.Countries.AddObject(country); } db.SaveChanges(); } }