【发布时间】:2016-07-03 10:05:45
【问题描述】:
我正在使用 ASP.NET 4.5、MVC5、C#、LINQ、EF6、SQL Server 2012/SQL Azure。
我需要显着提高复杂查询的效率。本质上,该任务的目的是复制具有许多子记录的“样本”记录集。我目前正在通过 C# 和 LINQ 执行此操作。我怀疑我在多个 Foreach 块中重新查询数据库,因此我导致了对数据库的多次调用。虽然每个查询很小,但调用次数却不是。可能是200+。我相信他们称之为“N+1”问题。
以下布局给出了关系和查询的概念。
Table1-<Table1.1
-<Table1.2-<Table1.2.1
-<Table1.2.2-<Table1.2.2.1
-<Table1.2.2.2
我不想使用“Foreach”来带回“Table1.1”等,而是想一次性带回所有相关数据,以尽量减少对数据库的调用次数。我知道我需要使用“包含”。我已经做到了:
db.Table1.Where(r=>r.Id=myId).Include(x=>x.Table1.2).Include(x=>x.Table1.2)
但是我不确定如何更改此语句以将数据恢复到“Table1.2.2.2”。这是我的问题。
提前谢谢你。
编辑 1
我找到了初步答案。
db.Table1.Include(x=>x.Table1.1)
.Include(x=>x.Table1.2)
.Include(x=>x.Table1.2.Select(y=>y.Table1.2.1)
但是我可能不需要中间线,所以下面可能没问题。
db.Table1.Include(x=>x.Table1.1)
.Include(x=>x.Table1.2.Select(y=>y.Table1.2.1)
想法...
EDIT2
我还需要下 5 级。我发现这个检索超时!这是否是因为 EF 在编译时感到困惑,或者检索太复杂,或者两者我都不确定。可以使用“包含”的级别可能有限制?另外我不确定通过指定孙子的路径然后自动检索父母,还是您必须单独指定父母?
【问题讨论】:
标签: entity-framework linq linq-to-entities entity-framework-6