我们有两个表 - Tasks和TasksUsers(分配给任务的用户)。 Task有EntityCollection,名为TaskUsers。
此查询返回每个用户名的任务数:
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
LukLed 5
我希望它返回:
管理员11
LukLed 5
null 10
某些任务没有任何作业,但我仍然希望它们在我的结果集中。通常,在SQL中,可以通过将join
更改为left join
来实现。在Linq,在EF之外,我可以使用DefaultIfEmpty()。如何在linq中实现?
答案 0 :(得分:2)
我的第一次尝试是:
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中,远更容易。
答案 1 :(得分:0)
我建议在这里查看与EF的左外连接:
http://geekswithblogs.net/SudheersBlog/archive/2009/06/11/132758.aspx