【问题标题】:How to update a record using LINQ LAMBDA in my ASP.NET MVC 5 Project如何在我的 ASP.NET MVC 5 项目中使用 LINQ LAMBDA 更新记录
【发布时间】:2018-02-12 02:49:51
【问题描述】:

我是实体框架和 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");
    }

【问题讨论】:

    标签: c# asp.net-mvc linq lambda asp.net-mvc-5


    【解决方案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 
        }
    

    【讨论】:

    • 先生,这有必要吗? _context.Entry(referral).State = System.Data.EntityState.Modified;
    • 和下面的答案使用。第一个或默认值。你能告诉我我应该使用哪一个吗? FirstOrDefault 还是 SingleOrDefault?
    • 是 EF 不够聪明,无法知道我正在修改一行吗?还是我们需要显式设置行状态?
    • SingleOrDefault 如果结果集中有超过 1 条记录,将引发错误。 FirstOrDefault 将返回第一条记录,如果没有记录,则返回 null。
    • 如果不明确设置状态,它很可能无法工作,但这可能取决于您的 EF 版本和设置。如果上下文跟踪记录,则不需要设置状态修改时显式。
    【解决方案2】:
    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
    

    【讨论】:

    • 先生,如果有多个记录匹配,我希望抛出异常。我的意思是如果我的应用程序必须正常工作,那么推荐的 ATMOST 1 结果是可能的。那么我应该使用 FirstorDefault 还是 SingleOrDerfault?
    • 结果将是一或零。我应该使用“SingleorDefault”还是“FirstOrDefault”
    • 我刚刚在 wiki 中阅读了这两个信息,它说如果我从“FirstOrDefault”获取多条记录,不会引发异常。你能指导我吗
    • @Unbreakable 在这里都有相同的用途,只是在获取匹配记录时查看是否有记录匹配(如果我们不想更新并且不需要匹配记录我们可以只需使用.Any)
    • 但是如果我错误地得到两个匹配的记录(一些幽灵数据),那么在这种情况下会发生什么。我永远不会得到正确的例外(如果我使用 first 或 default)?
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2021-07-19
    • 1970-01-01
    • 2016-10-27
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多