2016-05-30 10 views
2

外部APIから定義をロードするコードを作成しました。コードは単語のリストを繰り返し処理し、それぞれの定義を検索してから、EFを使用してこれらをSQL Serverデータベースに挿入すると考えました。行がEF/LINQで2回ロードされないようにする方法

しかし、これを2回実行すると、2回目に同じ定義が読み込まれます。既に存在する場合、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(); 
} 

このロードをよりうまく実装する方法についてのご意見がありましたら、ありがとうございます。

+0

はなぜとしてユニークなコラムをdefindeません – mohsen

答えて

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

Definitionの値を検索することができます。あなたはすでにあなたの価値を持っているWordDefinitionを得ることができます。このように

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