【问题标题】:Run multiple IQueryable's at single point of execution在单个执行点运行多个 IQueryable
【发布时间】:2016-12-22 13:12:36
【问题描述】:

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

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

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

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

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

有人对我如何实现这一点有任何想法吗?

【问题讨论】:

  • 看看future queries
  • 看起来很有趣,我去看看。谢谢。

标签: c# entity-framework linq iqueryable


【解决方案1】:

您必须针对实际数据库尝试此操作,但您可以使用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();

【讨论】:

  • 太好了。我现在已经设法对此进行了测试,并且我已经确认它确实按要求推迟了计数的执行。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多