Linq to entities - 如何定义左连接以进行分组?

时间:2010-03-04 03:33:22

标签: c# linq entity-framework linq-to-entities

我们有两个表 - 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中实现?

2 个答案:

答案 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