我有一个方法,当传递参数时返回一个IQueryable。在所有这些方法中,用于生成13个单独的IQueryable。
我需要的最终结果是在IQueryables中获得13个不同的记录集计数,但要使其比我当前的实现更有效:
var foo = iQueryableObject.Count();
var bar = iSecondQueryableObject.Count();
我想在单个执行点上运行SQL服务器上的所有计数,所以理论上是这样的:
var foobar = new IQueryable<object>[]
{
iQueryableObject.DeferredExecutionCount(),
iSecondQueryableObject.DeferredExecutionCount()
}.ToList();
有没有人对如何实现这一目标有任何想法?
答案 0 :(得分:1)
您必须针对实际数据库尝试此操作,但您可以使用GroupBy
和Union
(或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();