C# 如何在我的ASP.NET MVC 5项目中使用LINQ LAMBDA更新记录

C# 如何在我的ASP.NET MVC 5项目中使用LINQ LAMBDA更新记录,c#,asp.net-mvc,linq,lambda,asp.net-mvc-5,C#,Asp.net Mvc,Linq,Lambda,Asp.net Mvc 5,我不熟悉实体框架和LINQ。我遇到了一个问题,我需要首先检查记录是否已经存在,如果它已经存在,那么我需要使用列RESUMEID相应地更新记录。如果没有,那么我需要添加记录。我能够成功添加,但我不知道如何在LINQ中更新记录 以下是我的尝试: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(ReferralViewModel viewModel) { var candidate

我不熟悉实体框架和LINQ。我遇到了一个问题,我需要首先检查记录是否已经存在,如果它已经存在,那么我需要使用列RESUMEID相应地更新记录。如果没有,那么我需要添加记录。我能够成功添加,但我不知道如何在LINQ中更新记录

以下是我的尝试:

[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");
    }
这是解决办法

//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();
}
实际上,您不需要获取ISSuperDeferral,然后再次请求记录。尝试按以下方式组合代码:

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 
    }
这是解决办法

//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();
}
实际上,您不需要获取ISSuperDeferral,然后再次请求记录。尝试按以下方式组合代码:

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 
    }


先生,如果有多条记录匹配,我希望抛出异常。我的意思是,如果我的应用程序必须正常工作,那么ATMOST 1的推荐结果是可能的。所以我应该使用FirstorDefault还是SingleOrDerfault?结果要么是一,要么是零。我刚才在维基上读到“SingleorDefault”或“FirstOrDefault”这两个词,上面说如果我从“FirstOrDefault”中获得多条记录,将不会引发异常。你能帮我引路吗me@Unbreakable在这里,两者都有相同的用途,只是在获取匹配记录时查看是否有任何记录匹配(如果我们不想更新并且不需要匹配记录,我们可以简单地使用
.any
),但是如果我得到两个匹配记录(一些重影数据),那么在这种情况下会发生什么。我永远不会得到正确的异常(如果我使用firstordefault)?先生,我希望在多个记录匹配时抛出异常。我的意思是,如果我的应用程序必须正常工作,那么ATMOST 1的推荐结果是可能的。所以我应该使用FirstorDefault还是SingleOrDerfault?结果要么是一,要么是零。我刚才在维基上读到“SingleorDefault”或“FirstOrDefault”这两个词,上面说如果我从“FirstOrDefault”中获得多条记录,将不会引发异常。你能帮我引路吗me@Unbreakable在这里,两者都有相同的用途,只是在获取匹配记录时查看是否有任何记录匹配(如果我们不想更新并且不需要匹配记录,我们可以简单地使用
.any
),但是如果我得到两个匹配记录(一些重影数据),那么在这种情况下会发生什么。我永远不会得到正确的异常(如果我使用firstordefault)?先生,这是必要的吗<代码>\u context.Entry(reference).State=System.Data.EntityState.Modified和下面的答案使用。第一个默认值。你能告诉我该用哪一种吗。FirstOrDefault或SingleOrDefault?EF是否足够聪明,无法知道我正在修改一行?或者我们需要显式设置行状态吗?如果结果集中的记录超过1条,SingleOrDefault将抛出错误。FirstOrDefault将返回first records,如果没有记录,则返回null。如果不显式设置状态,它很可能无法工作,但这可能取决于您的EF版本和设置。如果记录由上下文跟踪,则在修改它时无需显式设置状态。先生,这是否必要<代码>\u context.Entry(reference).State=System.Data.EntityState.Modified和下面的答案使用。第一个默认值。你能告诉我该用哪一种吗。FirstOrDefault或SingleOrDefault?EF是否足够聪明,无法知道我正在修改一行?或者我们需要显式设置行状态吗?如果结果集中的记录超过1条,SingleOrDefault将抛出错误。FirstOrDefault将返回first records或null(如果没有记录)。如果不显式设置状态,它很可能无法工作,但这可能取决于您的EF版本和设置。如果记录由上下文跟踪,则在修改它时不需要显式设置状态。