在单个执行点运行多个IQueryable's

本文关键字:IQueryable 单个 执行 运行 | 更新日期: 2023-09-27 18:02:37

我有一个方法,当传递一个参数返回一个IQueryable。总的来说,这个方法被用来生成13个独立的IQueryable。

我需要的最终结果是在IQueryables中获得13个不同的记录集计数,但是要使这比我当前的实现更有效:

var foo = iQueryableObject.Count();
var bar = iSecondQueryableObject.Count();

我想在一个执行点上运行SQL服务器上的所有计数,所以理论上是这样的:

var foobar = new IQueryable<object>[]
{
    iQueryableObject.DeferredExecutionCount(),
    iSecondQueryableObject.DeferredExecutionCount()
}.ToList();

有没有人有任何想法,我如何才能实现这一点?

在单个执行点运行多个IQueryable's

您必须对实际的数据库进行尝试,但是您可以使用GroupByUnion(或Concat)来实现这一点。

考虑以下poco(您的EF实体):

class Thing
{
    public string One { get; set;}
}
class Thang
{
    public string Two { get; set;}
}

现在查询:

var foo= Things
    .Where(t => t.One == "One") //or whatever your filtering condition
    .GroupBy(t => t.One)
    .Select(t => new {Key = "FirstQuery", Count = t.Count()});
var bar = Thangs
    .Where(t => t.Two == "Two")
    .GroupBy(t => t.Two)
    .Select(t => new {Key = "SecondQuery", Count = t.Count()});
var deferredCounts = foo.Concat(bar).ToList();