【问题标题】:Linq to entities - How to define left join for grouping?Linq to entity - 如何为分组定义左连接?
【发布时间】:2010-03-04 21:38:45
【问题描述】:

我们有两个表 - 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
LukLed 5

我希望它返回:

管理员 11
LukLed 5
空 10

有些任务没有任何分配,但我仍然希望它们出现在我的结果集中。通常,在 SQL 中,通过将join 更改为left join 来实现。在 EF 之外的 Linq 中,我可以使用 DefaultIfEmpty()。如何在 linq to entity 中完成?

【问题讨论】:

  • @LukLed - 我删除了我的答案,因为它没有帮助。对不起...
  • 您确定不能使用 DefaultIfEmpty()?见msdn.microsoft.com/en-us/vcsharp/ee908647.aspx#leftouterjoin
  • @Foole:我写了,如果不是 EntityFramework,我可以使用它,但 DefaultIfEmpty 不适用于 EF。
  • DefaultIfEmpty 在 EF4 中有效,但在 EF1 中无效。

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


【解决方案1】:

我的第一次尝试是:

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();

或者类似的东西。或者只使用两个查询。不过,我不知道这是否是最好的方法。正如我在 cmets 中所指出的,这在 EF 4 中更容易。

【讨论】:

    【解决方案2】:

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

    http://geekswithblogs.net/SudheersBlog/archive/2009/06/11/132758.aspx

    【讨论】:

    • 谢谢,但它如何适用于我的问题?
    • 在底部,他解释了无法以这种方式进行连接的情况,因为上述其中之一说在 EF 4 中更容易做到这一点,我们不得不求助于 SP 来做一些我们之前的加入。
    • 他在哪里解释这是不可能的?
    • 第 4、5 和 6 点讨论了 EF 4 之前不支持包含的限制
    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多