使用实体框架组合多个表上的聚合函数



我目前通过这种方式获得2个聚合函数结果:

var fooCount = ctx.Foo.Count();
var barCount = ctx.Bar.Count();

这将生成两个不同的SQL查询。我正在寻找一种将这些组合成一个查询的方法。

在普通SQL中,我可以通过以下方式组合这两个查询:

SELECT 
  (SELECT COUNT(*) FROM Foo) AS FooCount,
  (SELECT COUNT(*) FROM Bar) AS BarCount

我们如何使用实体框架来做到这一点?我所发现的只是同一个表中的多个聚合函数。但就我而言,这是不同的表格。

我尝试过这样的东西,但没有成功:

var query = from together in (new
{
    FooCount = db.Foo.Count(),
    BarCount = db.Bar.Count()
}) select together; //<-- visual studio let me not write "select together;"

我想你想要的是这样的东西。基本上,通过一个常量进行分组,可以将计数聚合为IQueryable<int>,然后可以交叉连接它们。但我不知道这是否值得。基本上,你是在用可读性来换取性能的提升。

var counts = (from fc in (
                 from f in ctx.Foo
                 group f by 1 into fgrp
                 select fgrp.Count())
             from bc in (
                 from b in ctx.Bar
                 group b by 1 into bgrp
                 select bgrp.Count())
             select new { FooCount = fc, BarCount = bc }).Single();

最新更新