Entity Framework Core:需要 LINQ 建议使用包含关系表的更好方法

leo*_*leo 23 c# linq entity-framework-core

我有关于 Entity Framework Core 和使用 LINQ 的问题。我想在访问Clients表时获取其他表的详细信息。我可以使用下面的代码获取它们。我总共需要加入大约 10 个表,在这种情况下,下面的方法是好的还是其他更好的方法?ClientId是所有表的外键。

实际上我收到如下警告

[09:34:33 警告] Microsoft.EntityFrameworkCore.Query 编译一个查询,该查询通过“包含”或通过投影加载多个集合导航的相关集合,但尚未配置“QuerySplittingBehavior”。默认情况下,实体框架将使用“QuerySplittingBehavior.SingleQuery”,这可能会导致查询性能降低。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2134277 。要识别触发此警告的查询,请调用“ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))”

代码:

var client = await _context.Clients
                .Include(x => x.Address)
                .Include(x => x.Properties)
                .Include(x => x.ClientDetails)
                -------------------
                -------------------
                -------------------
                -------------------
                .Where(x => x.Enabled == activeOnly && x.Id == Id).FirstOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

Muj*_*jan 20

实际上,当您使用预加载(使用include())时,它使用左连接(一个查询中的所有需要​​的查询)来获取数据。它的默认行为是 ef 5 中的 ef 行为。您可以AsSplitQuery()在查询中设置拆分所有包含在单独查询中的内容。喜欢:

var client = await _context.Clients
            .Include(x => x.Address)
            .Include(x => x.Properties)
            .Include(x => x.ClientDetails)
            -------------------
            -------------------
            -------------------
            -------------------
            .Where(x =>x.Id == Id).AsSplitQuery().FirstOrDefaultAsync()
Run Code Online (Sandbox Code Playgroud)

这种方法需要更多的数据库连接,但这并不重要。对于最终的建议,我建议使用AsNoTracking()高性能查询。

  • 我相信如果没有 `AsSplitQuery()` ,就需要 `AsNoTrackingWithIdentityResolution()` ,否则它将多次映射同一个实体,我不知道使用 `AsSplitQuery()` 时是否相同。 (2认同)