C# 将sql查询转换为LINQ语句

C# 将sql查询转换为LINQ语句,c#,sql,linq,C#,Sql,Linq,我正在努力将此sql语句转换为LINQ语句 select r.FirstName + ' ' + r.Surname as [Name], count(*) as [Number of Submissions] from Researcher r join ResearcherSubmission rs on r.ResearcherID = rs.ResearcherID join Submission s on s.SubmissionID = rs.SubmissionID group

我正在努力将此sql语句转换为LINQ语句

select r.FirstName + ' ' + r.Surname as [Name], count(*) as  [Number of Submissions]
from Researcher r
join ResearcherSubmission rs on r.ResearcherID = rs.ResearcherID
join Submission s on s.SubmissionID = rs.SubmissionID
group by r.FirstName, r.Surname
这是我到目前为止得到的,但我可能完全错了,因为我对编写LINQ语句非常陌生

from r in Researcher
join rs in ResearcherSubmission on rs.ID equal s in Submission
count s in submission
group by r FirstName + ' ' + Surname

SQL查询确实提供了我要查找的结果。

您的SQL查询可以这样翻译:

var query= from r in db.Researchers
           join rs in db.ResearcherSubmissions on r.ResearcherID equals rs.ResearcherID
           join s in db.Submissions  on s.SubmissionID equals rs.SubmissionID
           group r by new {r.FirstName, r.Surname} into g
           select new {
                       Name= g.Key.FirstName + ' ' + g.Key.Surname,
                       NumberOfSubmissions= g.Count() 
                      };

return Json(query.ToList(), JsonRequestBehavior.AllowGet);
 var query= db.Researchers
              .Where(r=>r.Submissions.Count>0)
              .Select(r=>new {
                               Name= r.FirstName + ' ' + r.Surname,
                               NumberOfSubmissions= r.Submissions.Count 
                             }
                     );
 return Json(query.ToList(), JsonRequestBehavior.AllowGet);
更新 如果您使用的是实体框架,那么如果您使用导航属性而不是联接,则此查询可能会更容易。看到您的sql查询,我注意到
研究人员
提交人
之间存在多对多关系。假设你有这样一个模型:

public class Researcher
{
   public Researcher 
   {
     ResearcherSubmissions=new List<ResearcherSubmission>();
   }
   public int ResearcherId{get;set;}
   public string FirstName{get;set;}
   public string Surname{get;set;}
   public virtual ICollection<ResearcherSubmission> ResearcherSubmissions{get;set;}
}

public class ResearcherSubmission
{
    [Key, ForeignKey("Researcher"), Column(Order=1)]
    public int ResearcherId{get;set;}
    [Key, ForeignKey("Submission"), Column(Order=2)]
    public int SubmissionId {get;set;}

    public virtual Researcher Researcher{get;set;}
    public virtual Submission Submission {get;set;}
}

public class Submission
{
   public Submission
   {
     ResearcherSubmissions=new List<ResearcherSubmission>();
   }
   public int SubmissionId{get;set;}

   public virtual ICollection<ResearcherSubmission> ResearcherSubmissions{get;set;}
}
我在上面展示的解决方案是映射连接表(
ResearcherSubmissions
),但是如果该表只包含外键而不包含其他列,那么该表可以由EF抽象,并且双方获得一个导航属性,公开另一方的集合(如果您想了解有关该主题的更多信息,请选中此项):


感谢您提供的解决方案。但我正在尝试以lambda表达式的形式显示它,如下面的示例:返回Json(db.Submission.Select(p=>new{s.submissionID,p.Name,p.lasname}),JsonRequestBehavior.AllowGet);我试图在我的控制器中获取一个表达式,以便从我的数据库获取数据以显示报表,但为什么不能使用我上面显示的查询?您是否尝试过类似的方法:
Json(query.ToList(),JsonRequestBehavior.AllowGet)
。好的。但是我该如何将您的LINQ语句与Json代码结合起来呢?很抱歉,有这么多的Q,我对这个问题非常陌生。所以我正在运行我的代码,没有错误,但它不会显示报告。返回以下语句。“EntityFramework.dll中发生类型为'System.NotSupportedException'的异常,但未在用户代码中处理”。我使用了不使用Research Submission模型的查询
public class Researcher
{
   public Researcher 
   {
     Submissions=new List<Submission>();
   }
   public int ResearcherId{get;set;}
   public string FirstName{get;set;}
   public string Surname{get;set;}
   public virtual ICollection<Submission> Submissions{get;set;}
}

public class Submission
{
   public Submission
   {
     Researchers=new List<Researcher>();
   }
   public int SubmissionId{get;set;}

   public virtual ICollection<Researcher> Researchers{get;set;}
}
 var query= db.Researchers
              .Where(r=>r.Submissions.Count>0)
              .Select(r=>new {
                               Name= r.FirstName + ' ' + r.Surname,
                               NumberOfSubmissions= r.Submissions.Count 
                             }
                     );
 return Json(query.ToList(), JsonRequestBehavior.AllowGet);