【问题标题】:Linq - Group by multiple tablesLinq - 按多个表分组
【发布时间】:2010-08-08 18:16:59
【问题描述】:

使用 Linq to Sql 我如何对以下 2 个表进行分组。

订单表

CustomerID | Name   |Date            
1          | order1 | 2010-01-01  
2          | order2 | 2010-01-01
2          | order3 | 2010-04-01

来电表

CustomerID | Name   |Date            
1          | call1 | 2010-01-01  
3          | call2 | 2010-06-01
2          | call3 | 2010-05-01

我想按日期对两张表进行分组,结果

Date       | Orders | Calls
2010-01-01 | 2      | 1
2010-04-01 | 1      | 0
2010-05-01 | 0      | 1
2010-06-01 | 0      | 1

我知道如何对单个表进行分组,

from o in Orders        
group o by o.Date.Date into og
select new {Date = og.Key,Orders= og.Count()};

如何将两者分组? 谢谢!

【问题讨论】:

    标签: c# asp.net linq linq-to-sql


    【解决方案1】:

    由于这两个表似乎具有相似的结构,我建议将它们投影到等效的形式中,然后对这两个集合的串联进行分组。

    var orders = from o in Orders 
                select new { IsOrder = true, o.Date };
    var calls = from c in Calls 
                select new { IsOrder = false, c.Date };
    
    var result = from x in orders.Concat(calls)        
                group x by x.Date into og
                select new {Date = og.Key, Orders= og.Count(o=>o.IsOrder), Calls = og.Count(c=>!c.IsTrue)};
    

    由于 Linq2Sql 的惰性特性,这实际上可能会简化为单个查询。为了提高性能,我会确保这不是来自地狱的查询。

    【讨论】:

    • 你能给我举个例子吗?
    • 谢谢! ,我希望我可以使用常规的 linq/sql 命令,我没有考虑连接这两个表。如果这是普通的 TSQL,你会这样做吗?
    • 在 TSQL 中我会使用完全外连接,但这在 L2S 中并不容易,我希望我提供的解决方案比编写完全外连接更简单。如果您想了解有关如何在 Linq 中使用 FOJ 的更多信息,只需搜索 SO。
    • 我搜索过,很复杂。 :(
    • 我的解决方案有什么不好?
    【解决方案2】:

    可以使用 Union 方法:

        var result =
            (from c in Calls group c by c.Date into cg select new {Date = cg.Key, Calls = cg.Count(), Orders = 0})
            .Union(from o in Orders group o by o.Date into og select new {Date = og.Key, Calls = 0, Orders = og.Count()})
            .GroupBy(x => x.Date)
            .Select(g => new {Date = g.Key, Calls = g.Max(r => r.Calls), Orders = g.Max(r => r.Orders)});
    
        foreach (var row in result)
        {
            Trace.WriteLine(row);
        }
    

    这与您编写的 SQL 非常相似(两个表的并集,然后是外部查询以将结果合并到一行中)

    【讨论】:

    • 是的,但它更有可能导致单个 SQL 语句。最好将它们都放入并查看调试器:)
    • 我得到“使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式”,认为如果表具有不同的日期查询将失败
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2014-01-02
    • 2012-02-11
    相关资源
    最近更新 更多