2014-10-03 40 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