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