实体框架核心-计数在内存中执行

时间:2019-09-23 10:28:14

标签: entity-framework-core

简单方案:两个表,MainTable包含多个SubTable对象,每个SubTable都有一个MainTable。

我已打开“延迟加载”。

我想获取一个MainTable对象并计算它获得了多少个SubTable。如果我直接在Context的Set()上调用Count(),它将起作用:

using (var context = new DatabaseContext(DbContextOptions))
{
    context.Database.OpenConnection();

    var mainTable = context.Set<MainTable>()
        .FirstOrDefault(t => t.Id == 1);
    var count = context.Set<SubTable>().Where(t => t.MainTableId == mainTable.Id).Count();

    context.Database.CloseConnection();
}

这里有两个查询:

SELECT TOP(1) [t].[Id]
FROM [MainTables] AS [t]
WHERE [t].[Id] = 1

exec sp_executesql N'SELECT COUNT(*)
FROM [SubTables] AS [t]
WHERE [t].[MainTableId] = @__mainTable_Id_0',N'@__mainTable_Id_0 int',@__mainTable_Id_0=1

这种方法行得通,但是我很乐意在对对象集合本身调用Count()时看到它的工作,就像这样:

using (var context = new DatabaseContext(DbContextOptions))
{
    context.Database.OpenConnection();

    var mainTable = context.Set<MainTable>()
        .FirstOrDefault(t => t.Id == 1);
    var count = mainTable.SubTables.Count();

    context.Database.CloseConnection();
}

但是此方法会生成以下sql:

exec sp_executesql N'SELECT [e].[Id], [e].[MainTableId]
FROM [SubTables] AS [e]
WHERE [e].[MainTableId] = @__get_Item_0',N'@__get_Item_0 int',@__get_Item_0=1

并在内存中执行Count()。

是因为我做错了什么还是仅仅是EF Core限制?我在互联网上找不到任何信息。

0 个答案:

没有答案