2014-10-03 65 views
1

我有兩個實體:如何創建一個左外連接和另一個表的計數的SQL?

public class AdminTest 
{ 
    public AdminTest() 
    { 
     this.AdminTestQuestions = new List<AdminTestQuestion>(); 
     this.UserTests = new List<UserTest>(); 
    } 
    public int AdminTestId { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<AdminTestQuestion> AdminTestQuestions { get; set; } 
    public virtual ICollection<UserTest> UserTests { get; set; } 
} 

public UserTest() 
    { 
     this.UserTestQuestions = new List<UserTestQuestion>(); 
    } 

    public int AdminTestId { get; set; } 
    public int CreatedBy { get; set; } 
    public int UserTestId { get; set; } 
    public virtual AdminTest AdminTest { get; set; } 
} 

我可以用LEFT OUTER JOIN這些JOIN這樣的:

SELECT AdminTest.AdminTestId, AdminTest.Title, UserTest.CreatedBy FROM AdminTest 
LEFT OUTER JOIN UserTest 
ON AdminTest.AdminTestId = UserTest.AdminTestId 

得到:

AdminTestId  Title  CreatedBy 
1     A   NULL 
2     B   99 

我也有一個表,列出每個adminTest中的問題:

public partial class AdminTestQuestion 
{ 
    public int AdminTestQuestionId { get; set; } 
    public int AdminTestId { get; set; } 
    public System.Guid QuestionUId { get; set; } 
    public virtual AdminTest AdminTest { get; set; } 

} 

我怎麼能修改我的SQL在附加表AdminTestQuestions加給的問題數是這樣的:

AdminTestId  Title  Questions CreatedBy 
1     A   10   NULL 
2     B   20   99 

我使用LINQ與實體框架6這樣一個LINQ或SQL的解決方案將是一件好事。

回答

1

SQL

SELECT 
    AdminTest.AdminTestId, 
    AdminTest.Title, 
    COUNT(AdminTestQuestion.AdminTestQuestionId) Questions, 
    UserTest.CreatedBy 
FROM 
    AdminTest LEFT OUTER JOIN UserTest 
ON 
    AdminTest.AdminTestId = UserTest.AdminTestId JOIN AdminTestQuestion 
ON 
    AdminTest.AdminTestId = AdminTestQuestion.AdminTestId 
GROUP BY 
    AdminTest.AdminTestId, AdminTest.Title, UserTest.CreatedBy 

LINQ

var query = from at in db.AdminTests 
      join ut in db.UserTests 
      on at.AdminTestId equals ut.AdminTestId into at_uts 
      from at_ut in at_uts.DefaultIfEmpty() 
      select new 
      { 
       at.AdminTestId, 
       at.Title, 
       Questions = at.AdminTestQuestions.Count(), 
       at_ut.CreatedBy 
      }; 
在某些情況下
+0

或者 「計數(不同leftKey)」,或者 「總和(情況下rightKey爲null,則leftValue否則返回null結束)」 也可以你在找什麼。 – 2014-10-03 04:10:32

相關問題