C# 如何将LINQ查询分配给变量,然后在以后的代码中使用它
业务逻辑: 我有三张桌子<代码>参考,C# 如何将LINQ查询分配给变量,然后在以后的代码中使用它,c#,asp.net-mvc,linq,lambda,asp.net-mvc-5,C#,Asp.net Mvc,Linq,Lambda,Asp.net Mvc 5,业务逻辑: 我有三张桌子参考,参考,参考实例与参考表中的多对多关系。应聘者将收到一份推荐表,填写工作申请。推荐表单由用户发布,并显示给与请求公司相关的所有推荐人(即员工)。此外,请求公司的员工可以选择“接受”或“拒绝”该配置文件(此详细信息在实例表中捕获) 需要的行为: 现在,当候选人添加推荐表时,基于特定条件(如下所述),我想检查此推荐请求是否已经存在。如果已经存在,则显示警告/弹出窗口 条件1: 当候选人刚刚发布了推荐请求时。然后ReferralInstance表将为空,因此我需要检查Com
参考
,参考实例
与参考
表中的多对多
关系。应聘者将收到一份推荐表,填写工作申请。推荐
表单由用户发布,并显示给与请求公司相关的所有推荐人(即员工)。此外,请求公司的员工可以选择“接受”
或“拒绝”
该配置文件(此详细信息在实例表中捕获)
需要的行为:
现在,当候选人添加推荐表时,基于特定条件(如下所述),我想检查此推荐请求是否已经存在。如果已经存在,则显示警告/弹出窗口
条件1:
当候选人刚刚发布了推荐请求时。然后ReferralInstance
表将为空,因此我需要检查CompanyId
、CandidateId
和SkillId
是否匹配,如果这三个匹配项都与我想要设置的hasPreviousRequest
为true
条件2:
当候选者发布请求并且SkillId
时,CompanyId
和CandidateId
匹配。许多员工(属于被请求的公司)拒绝了他,但没有人接受,然后我想将hasPreviousRequest
设置为true
条件3:
当应聘者发布了推荐请求,并且SkillId
,CompanyId
,CandidateId
匹配,但其中一位推荐者已经接受了他的工作,在这种情况下,我想将hasPreviousRequest
设置为false
以下是我的尝试:
[HttpPost]
public JsonResult CheckForExistingReferral(ReferralViewModel viewModel)
{
bool hasPreviousRequest = false;
var candidateId = User.Identity.GetUserId();
// CHCEKING CONDITION ONE
if (_context.Referrals
.Any(r => ((r.CandidateId == candidateId)
&& (r.CompanyId == viewModel.CompanyId)
&& (r.SkillId == viewModel.SkillId))))
{
// NOW CHECKING CONDITION TWO
if (_context.Referrals
.Any(r => ((r.CandidateId == candidateId)
&& (r.CompanyId == viewModel.CompanyId)
&& (r.SkillId == viewModel.SkillId))
&& r.ReferralInstances
.Any(e => (e.ReferrerId != null) && (e.ReferralStatus == "Accepted"))))
{
hasPreviousRequest = false;
}
else
hasPreviousRequest = true;
}
return Json(new { hasPreviousRequest = hasPreviousRequest });
}
在上面的尝试中,我做了两次相同的部分LINQ查询。或者我想要一个更好的LINQ来同时检查所有三个条件。如果不是,那么我想要存储条件1中使用的LINQ查询,并在检查条件2时使用它
如下所示:
[HttpPost]
public JsonResult CheckForExistingReferral(ReferralViewModel viewModel)
{
bool hasPreviousRequest = false;
var candidateId = User.Identity.GetUserId();
var PartialLINQ = _context.Referrals
.Any(r => ((r.CandidateId == candidateId)
&& (r.CompanyId == viewModel.CompanyId)
&& (r.SkillId == viewModel.SkillId)));
if (PartialLiinq)
{
// SOMETHING LIKE THIS
if (PartialLinq
&& r.ReferralInstances
.Any(e => (e.ReferrerId != null) && (e.ReferralStatus == "Accepted"))))
{
hasPreviousRequest = false;
}
else
hasPreviousRequest = true;
}
return Json(new { hasPreviousRequest = hasPreviousRequest });
}
编辑
引用说明
有4个属性:
在条件1中,您指的是
CoverLetterId
-这应该是SkillId
`?是的,很抱歉您的尝试中输入了错误,您正在检查partialInq两次。您不认为第二次检查是多余的吗?这就是我想要避免的。我不确定如何避免它。如何链接LINQ并检查LINQ的后半部分仅限。您的第二个条件重复了第一个条件中的一些条件,您只需要检查第二个条件的引用说明表。您的引用说明表的属性是什么?这个看起来可以实现。我现在就试试。出于好奇,您能告诉我第一个条件吗我在问题中发布的代码片段。在逻辑上是否存在任何缺陷?能否请您交叉检查一次。我相信它仍然可以工作,这只是性能和糟糕的设计。您运行了您的代码吗?它没有给您结果吗?我仍在开发代码,尚未达到运行测试的程度。但我将尝试您的解决方案很快:)好的,如果您仍然需要帮助,请告诉我:)我们可以使用LINQ的Lamda样式而不是SQL样式吗?
[HttpPost]
public JsonResult CheckForExistingReferral(ReferralViewModel viewModel)
{
bool hasPreviousRequest = false;
var candidateId = User.Identity.GetUserId();
// Do an outer join between the tables on ReferralID and select only a new Anonymous type that has referrerId
// and status. If no record found in ReferralInstances then set status to empty.
var result = (from r in _context.Referrals
join ri in _context.ReferralInstances on r.ReferralID equals ri.ReferralID into refsInst
where ((ri.CandidateId == candidateId) &&
(ri.CompanyId == viewModel.CompanyId) &&
(ri.SkillId == viewModel.SkillId))
from rs in refsInst.DefaultIfEmpty()
select new {ReferenceEquals = rs.ReferrerId, Status = rs == null ? "":rs.ReferralStatus})
.ToList();
// This covers third condition
if(result.Any(p => p.ReferrerId != null && p.Status == "Accepted"))
{
hasPreviousRequest = false;
}
// This covers first and second conditions. If nothing found in ReferralInstances, the status will be empty
if(result.Any() && result.All(p => p.Status != "Accepted"))
{
hasPreviousRequest = true;
}
return Json(new { hasPreviousRequest = hasPreviousRequest });
}