简单方案:两个表,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限制?我在互联网上找不到任何信息。