Entity Framework Core - подсчет выполняется в памяти - PullRequest
0 голосов
/ 23 сентября 2019

Простой сценарий: две таблицы, MainTable содержит несколько объектов SubTable, у каждой SubTable есть одна MainTable.

У меня включена отложенная загрузка.

Я хочу получить объект MainTable и посчитать, какмного SubTables это получило.Это работает, если я вызываю Count () непосредственно для Set () контекста:

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

Thisподход работает, но я бы хотел, чтобы он работал при вызове 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?Я не смог найти информацию об этом в интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...