簡體   English   中英

將SQL查詢轉換為LINQ語句

[英]convert sql query to LINQ statement

我正在努力將此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);

更新資料

如果您使用的是Entity Framework,那么如果您使用導航屬性而不是聯接,則此查詢可能會更容易。 看到您的sql查詢,我注意到您在ResearchersSubmissions之間存在多對多關系。 假設您有一個這樣的模型:

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;}
}

您的查詢將是:

 var query= db.Researchers
              .Where(r=>r.ResearcherSubmissions.Count>0)// Researchers that have submissions
              .Select(r=>new {
                               Name= r.FirstName + ' ' + r.Surname,
                               NumberOfSubmissions= r.ResearcherSubmissions.Count 
                             }
                     );
 return Json(query.ToList(), JsonRequestBehavior.AllowGet);

我上面顯示的解決方案是映射聯結表( ResearcherSubmissions ),但是如果該表僅由外鍵組成,而沒有其他列,則該表可以由EF進行抽象,並且兩側都將獲得一個導航屬性,從而暴露出該表的集合。另一面(如果您想進一步了解該主題,請查看此鏈接 ):

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM