我将 LINQ to SQL 结果投影到强类型类:父类和子类。这两个查询之间的性能差异很大:
慢查询 - 从 DataContext 记录显示正在为每个父级单独调用 db
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
快速查询 - 从 DataContext 记录显示单个 db hit 查询,该查询返回所有必需的数据
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
我想强制 LINQ 使用第二个示例的单查询样式,但直接使用它们的 Children 对象填充 Parent 类。否则,Children 属性是一个IQuerierable<Child>
必须被查询才能公开 Child 对象的属性。
引用的问题似乎没有解决我的情况。使用 db.LoadOptions 不起作用。也许它要求类型是在 DataContext 中注册的 TEntity。
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
请注意:Parent 和 Child 是简单类型,而不是Table<TEntity>
类型。Parent 和 Child 之间没有上下文关系。子查询是临时的。
问题的症结:在第二个 LINQ 示例中,我实现了IQueriable
语句并且不调用ToList()
函数,并且由于某种原因 LINQ 知道如何生成一个可以检索所有必需数据的单个查询。如何使用第一个查询中完成的实际数据填充我的临时投影?另外,如果有人可以帮助我更好地表达我的问题,我将不胜感激。