Linq to entities - How to define left join for grouping?

问题描述 投票:0回答:2

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

c# linq entity-framework linq-to-entities
2个回答
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 中更容易far


0
投票

我建议看这里它通过 EF 的左外连接:

链接

© www.soinside.com 2019 - 2024. All rights reserved.