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()高性能查询。