Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将LINQ查询分配给变量,然后在以后的代码中使用它_C#_Asp.net Mvc_Linq_Lambda_Asp.net Mvc 5 - Fatal编程技术网

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个属性:

  • Id PK 2.引用Id FK 3.引用FK 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 });
    }