我们有两个表 - Tasks 和 TasksUsers(分配给任务的用户)。任务具有名为 TaskUsers 的 EntityCollection。
此查询返回每个用户名的任务数:
model.TaskCountByAssignee =
(
from t in TaskRepository.List()
from tu in t.TaskUsers
group tu by tu into tug
select new {Count = tug.Count(), UserName = tug.Key.Username}).ToList()
此查询返回:
管理员 11
幸运 5
我想要它回来:
管理员 11
幸运 5
空 10
有些任务没有任何赋值,但我仍然希望它们出现在我的结果集中。通常,在SQL中,通过将
join
改为left join
来实现。在 EF 之外的 Linq 中,我可以使用 DefaultIfEmpty()。如何在 linq to entities 中完成?
我的第一次尝试是:
model.TaskCountByAssignee = (
(from t in TaskRepository.List()
from tu in t.TaskUsers
group tu by tu.UserName into tug
select new {Count = tug.Count(), UserName = tug.Key})
.Union(from t in TaskRepository.List()
where !t.TaskUsers.Any()
group t by 1 into tug
select new {Count = tug.Count(), UserName = null}).ToList();
或者类似的东西。或者只使用两个查询。不过,我不知道这是否是最好的方法。正如我在评论中指出的那样,这在 EF 4 中更容易far
我建议看这里它通过 EF 的左外连接: