2017-09-28 3 views
-1

以下のコードを確認してください。私は間違ったエンティティクエリを持っていると思います。条件とマークされたエンティティクエリの2番目の内部をチェックします。このCategoryIDが利用できない場合、私の目標はデータを保存することです。しかし、私はそれをデバッグで実行すると、私は単純にif条件がスキップされるのを見ることができますが、私のデータベースにはデータがないので、空でなければならず、コードの中で実行する必要があります。私は以下のようなエンティティクエリーに間違ったことをしていると思います。何か案が?データが存在しない場合は条件を実行してください

ctx.Level1Cats.Any(X => x.Level1CatId!= item.CategoryID.ToString())

foreach (CategoryType item in categories) 
{ 
    if (item.CategoryLevel == 1) 
    { 
     if (ctx.Level1Cats.Any(x => x.Level1CatId != item.CategoryID.ToString())) 
     { 
      CatLevel1.Level1CatId = item.CategoryID; 
      CatLevel1.Name = item.CategoryName; 
      ctx.Level1Cats.Add(CatLevel1); 
      //ctx.SaveChanges(); 
     } 
     else if (ctx.Level1Cats.Any(x => x.Level1CatId == item.CategoryID.ToString())) 
     { 
      CatLevel1.Level1CatId = item.CategoryID; 
      CatLevel1.Name = item.CategoryName; 
      ctx.Entry(CatLevel1).State = EntityState.Modified; 
      ctx.SaveChanges(); 
     } 
    } 
} 
+0

なぜitem.CategoryIDがToString()ですか? IDは数字ではありませんか? –

+0

はい私のデータベースも同じIDはその文字列ではありません@LiakatHossain –

+0

'ctx.Level1Cats'には複数の項目が含まれていると仮定すると、' if'を*常に* trueにすると思います。 ctx.Level1Catsに1つのエントリとitem.CategoryID *が1つのエントリのIDである場合は、おそらくfalseになる可能性があります。 – Fildor

答えて

0

既存のコードを使用して、あなたの問題を解決するために、あなたはAllを使用することができますifの内側にして、単に追加のチェックなしで標準elseを使用します。

if (ctx.Level1Cats.All(x => x.Level1CatId != item.CategoryID.ToString())) 
{ 
    ... 
} 
else 
{ 
    ... 
} 

これはあなたのに入りますitem.CategoryIDが存在しない場合はブロックになります(リスト自体が空の場合はAllがtrueを返します)。それ以外の場合は、あなたの代わりに使用されます。

別のオプションは、論理をAnyを保つが、反転させるために、次のようになります。この場合

if (ctx.Level1Cats.Any(x => x.Level1CatId == item.CategoryID.ToString())) 
{ 
    // UPDATE. 
} 
else 
{ 
    // ADD. 
} 

、項目のいずれかがitem.CategoryIDと一致した場合、あなたはあなたのアップデートをpeformます。それ以外の場合はAddになります。

私の経験では、表示される2番目の選択肢が一般的です。興味のある項目を見つけてそれに応じて具体的に探しています。

+0

ちょうど興味がありませんでしたが、どのオプションを使用しましたか? –

関連する問題