C# 如何确保不使用EF/LINQ两次加载行
我创建了从外部API加载定义的代码。代码遍历一个单词列表,查找每个单词的定义,然后我想使用EF将它们插入到我的SQLServer数据库中 但是,如果我运行两次,它将在第二次加载相同的定义。是否有一种方法可以使EF不添加已经存在的行C# 如何确保不使用EF/LINQ两次加载行,c#,sql-server,linq,C#,Sql Server,Linq,我创建了从外部API加载定义的代码。代码遍历一个单词列表,查找每个单词的定义,然后我想使用EF将它们插入到我的SQLServer数据库中 但是,如果我运行两次,它将在第二次加载相同的定义。是否有一种方法可以使EF不添加已经存在的行 public IHttpActionResult LoadDefinitions() { var words = db.Words .AsNoTracking() .ToList(); foreach (var wor
public IHttpActionResult LoadDefinitions()
{
var words = db.Words
.AsNoTracking()
.ToList();
foreach (var word in words)
{
HttpResponse<string> response = Unirest.get("https://wordsapiv1.p.mashape.com/words/" + word)
.header("X-Mashape-Key", "xxxx")
.header("Accept", "application/json")
.asJson<string>();
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(response.Body);
var results = rootObject.results;
foreach (var result in results)
{
var definition = new WordDefinition()
{
WordId = word.WordId,
Definition = result.definition
};
db.WordDefinitions.Add(definition);
}
db.SaveChanges();
}
return Ok();
}
public IHttpActionResult加载定义()
{
var words=db.words
.AsNoTracking()
.ToList();
foreach(单词中的var单词)
{
HttpResponse response=Unirest.get(“https://wordsapiv1.p.mashape.com/words/“+字)
.标题(“X-Mashape-Key”、“xxxx”)
.header(“接受”、“应用程序/json”)
.asJson();
RootObject RootObject=JsonConvert.DeserializeObject(response.Body);
var results=rootObject.results;
foreach(结果中的var结果)
{
var definition=newworddefinition()
{
WordId=word.WordId,
Definition=result.Definition
};
db.WordDefinitions.Add(定义);
}
db.SaveChanges();
}
返回Ok();
}
如果有人对我如何更好地实现此加载有任何建议,也将不胜感激。您可以搜索
定义
值
var wd = db.WordDefinition.FirstOrDefault(x => x.Definition == result.definition);
if(wd == null) {
var definition = new WordDefinition() {
WordId = word.WordId,
Definition = result.definition
};
db.WordDefinitions.Add(definition);
}
通过这种方式,您可以获得已经具有您的值的单词定义
如果您也可以以相同的方式使用WordId
:
var wd = db.WordDefinition.FirstOrDefault(x => x.WordId == word.WordId);
为什么不将列定义为唯一的
foreach (var result in results)
{
if(!(from d in db.WordDefinitions where d.Definition == result.definition select d).Any())
{
var definition = new WordDefinition()
{
WordId = word.WordId,
Definition = result.definition
};
db.WordDefinitions.Add(definition);
}
}