如何创建一个左外连接和另一个表的计数的SQL?
问题描述:
我有两个实体:如何创建一个左外连接和另一个表的计数的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的解决方案将是一件好事。
答
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
};
在某些情况下
或者 “计数(不同leftKey)”,或者 “总和(情况下rightKey为null,则leftValue否则返回null结束)” 也可以你在找什么。 – 2014-10-03 04:10:32