C# 如何在我的ASP.NET MVC 5项目中使用LINQ LAMBDA更新记录
我不熟悉实体框架和LINQ。我遇到了一个问题,我需要首先检查记录是否已经存在,如果它已经存在,那么我需要使用列RESUMEID相应地更新记录。如果没有,那么我需要添加记录。我能够成功添加,但我不知道如何在LINQ中更新记录 以下是我的尝试: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
[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版本和设置。如果记录由上下文跟踪,则在修改它时不需要显式设置状态。