2017-09-03 17 views
0

エンティティフレームワークとLINQを初めて使用しています。私は最初にレコードが存在するかどうかを確認する必要がある問題に悩まされています。それが存在する場合は、それに応じてRESUMEIDという列でレコードを更新する必要があります。そうでなければ、レコードを追加する必要があります。私は正常に追加することができますが、私はLINQでレコードを更新する方法がわかりません。ASP.NET MVC 5プロジェクトでLINQ LAMBDAを使用してレコードを更新する方法

以下

は私の試みです:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(ReferralViewModel viewModel) 
    { 
     var candidateId = User.Identity.GetUserId(); 
     // I AM CONFUSED ABOUT BELOW STATEMENT 
     var IsDupeReferral = _context.Referrals 
     .Where(r => (r.CandidateId == candidateId) 
     && (r.CompanyId == viewModel.CompanyId) && (r.SkillId == viewModel.SkillId)) 
     .Select(r=>r.ReferralId).SingleOrDefault(); 

     if(IsDupeReferral!=0) 
     { 
      //IF I FIND DUPE REFERRAL RECORD I WANT TO UPDATE SOME OF THE VALUES IN THAT 
        _context.Referrals.Where(r => r.ReferralId == IsDupeReferral). 
      AND UPDATE r.resumeId with viewModel.ResumeId // How to do this? 
      // NOT SURE ABOUT BELOW LINE EITHER 
      _context.SaveChanges(); 
     } 
     else 
     { 
      // BELOW CODE IS WORKING FINE 
      var referral = new Referral 
      { 
       ReferralName = viewModel.ReferralName, 
       ResumeId = viewModel.ResumeId, 
       CandidateId = candidateId, 
       DegreeId = viewModel.DegreeId, 
       CoverLetterId = viewModel.CoverLetterId, 
       SkillId = viewModel.SkillId 
      }; 

      if (!string.IsNullOrEmpty(viewModel.TempCompany)) 
      { 
       var newCompany = new Company 
       { 
        CompanyName = viewModel.TempCompany 
       }; 
       newCompany.Referrals.Add(referral); 
       _context.Companies.Add(newCompany); ; 
      } 
      else 
      { 
       referral.CompanyId = viewModel.CompanyId.Value; 
       _context.Referrals.Add(referral); 
      } 
      _context.SaveChanges(); 
     } 

     return RedirectToAction("ReferralCenter"); 
    } 

答えて

1

ここで解決

//IF I FIND DUPE REFERRAL RECORD I WANT TO UPDATE SOME OF THE VALUES IN THAT 
var referral = _context.Referrals.FirstOrDefault(r => r.ReferralId == IsDupeReferral); 
// AND UPDATE r.resumeId with viewModel.ResumeId 
if (referral !=null) { 
    referral.resumeId = viewModel.ResumeId; 
    _context.Entry(referral).State = System.Data.EntityState.Modified; 
    _context.SaveChanges(); 
} 

は実際に、あなたはIsDupeReferralを取得する必要はありませんだと、再度レコードを要求します。コードを以下のように組み合わせてみてください:

var referral = _context.Referrals 
     .Where(r => (r.CandidateId == candidateId) 
     && (r.CompanyId == viewModel.CompanyId) && (r.SkillId == viewModel.SkillId)).SingleOrDefault(); 

    if (referral !=null) { 
     referral.resumeId = viewModel.ResumeId; 
     _context.Entry(referral).State = System.Data.EntityState.Modified; 
     _context.SaveChanges(); 
    } 
    else { 

    // add a new record 
    } 
+1

先生、これは必要ですか? '_context.Entry(照会).State = System.Data.EntityState.Modified;' – Unbreakable

+0

以下は、回答の用途です。 FirstOrDefault。あなたは私がどちらを使うべきかを親切に教えてくれますか? FirstOrDefaultまたはSingleOrDefault? – Unbreakable

+1

EFは私が行を修正していることを知るのに十分スマートではありませんか?または、行の状態を明示的に設定する必要がありますか? – Unbreakable

1
Referral referral = _context.Referrals.FirstOrDefault(r=> r.ReferralId = SomeId); 
if(referral == null) // then referral does not exist - add it 
{ 
    referral = new Referral{ 
       ReferralName = viewModel.ReferralName, 
       ResumeId = viewModel.ResumeId, 
       CandidateId = candidateId, 
       DegreeId = viewModel.DegreeId, 
       CoverLetterId = viewModel.CoverLetterId, 
       SkillId = viewModel.SkillId 
      }; 
    _context.Referrals.Add(referral); 
} 
else // referral already exists - update its values 
{ 
    //make changes to referral 
    referral.ReferralName = viewModel.ReferralName; 
    referral.ResumeId = viewModel.ResumeId; 
    referral.CandidateId = candidateId; 
    referral.DegreeId = viewModel.DegreeId; 
    referral.CoverLetterId = viewModel.CoverLetterId; 
    referral.SkillId = viewModel.SkillId; 

} 
_context.SaveChanges(); //no matter added or updated - save the changes 
+0

Sir、複数のレコードが一致すると例外がスローされるようにします。私のアプリケーションが正しく動作する必要がある場合、紹介からのATMOST 1の結果が可能です。だから私はFirstorDefaultまたはSingleOrDerfaultを使うでしょうか? – Unbreakable

+0

結果は1または0のいずれかになります。私は "SingleOrDefault"または "FirstOrDefault"を使用しなければなりません – Unbreakable

+0

私は今、wikiの両方について読んでおり、 "FirstOrDefault"から複数のレコードを取得しても例外はスローされません。あなたは親切に私を案内することができます – Unbreakable