c# - 在单个执行点运行多个 IQueryable

标签 c# entity-framework linq iqueryable

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

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

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

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

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

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

最佳答案

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

关于c# - 在单个执行点运行多个 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970186/

相关文章:

c# - 在 Linq-to-SQL 中,IMultipleResults 是否多次访问数据库?

c# - 如何在文本框中绑定(bind) gridview 以及如何在 asp.net 中计算总值

c# - 如何在控制台中显示运行时间?

c# - 使用 Azure Functions 和 .NET 5 将不同的连接字符串传递到 IDesignTimeDbContextFactory(独立)

c# - 使用 ASP .NET Core Identity 和 EntityFrameworkCore 注册新用户时出现 InvalidOperationException

c# - LINQ 中的 ISNULL 等价物

C# - 如何在对象列表上执行多个包含过滤器

c# - wpf UIElement 是否有任何唯一标识符?

c# - C# 中的切换按钮

entity-framework - 使用 EF 和 WebAPI,如何返回 ViewModel 并支持 IQueryable/OData?