在 Entity Framework 中,我们可以使用 Include 预加载单行实体及其关联实体。
例如,假设实体 A 与实体 B、C 和 D 之间存在一对多关系:
var a = context.A
.Where(a => a.Id == 7)
.Include(a => a.B)
.Include(a => a.C)
.Include(a => a.D)
.Single();
但是,这样的查询可能效率低下。例如,在本例中,我们生成一个 SQL 查询,该查询返回 A 与 B、C 和 D 的连接。因此,结果行的宽度大约等于四个表的组合宽度。如果所有条目的列数大致相同,则查询将返回一个比实际值大四倍的有效负载。如果我们查询到更深层次,生成的 SQL 效率会更低。
为了提高效率,我们可以使用显式加载和 Load() 方法。例如,
var a = context.A
.Where(a => a.Id == 7)
.Single();
var b = context.Entry(a).Collection(a => a.B).Load().ToList();
var c = context.Entry(a).Collection(a => a.C).Load().ToList();
var d = context.Entry(a).Collection(a => a.D).Load().ToList();
这映射成四个单独的查询,返回与以前相同的总行数,但宽度只有四分之一。
在 Breeze.js 中,.expand() 映射到服务器上的 .Include()。所以我用
var query = breeze.EntityQuery
.from("A")
.where("Id", "==", 7)
.expand("B, C, D");
但是是否有任何 Breeze.js 查询将映射到服务器上的显式加载并导致更有效的查询,如上面的 EF Eager Loading 示例中所示?也许这可以使用合并来完成,但我不知道该怎么做。