Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保不使用EF/LINQ两次加载行_C#_Sql Server_Linq - Fatal编程技术网

C# 如何确保不使用EF/LINQ两次加载行

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

我创建了从外部API加载定义的代码。代码遍历一个单词列表,查找每个单词的定义,然后我想使用EF将它们插入到我的SQLServer数据库中

但是,如果我运行两次,它将在第二次加载相同的定义。是否有一种方法可以使EF不添加已经存在的行

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);
    }
}