我将LINQ to SQL结果投影到强类型类:Parent和Child。这两个查询之间的性能差异很大:一对多预测LINQ查询重复执行
慢查询 - 从DataContext的记录显示,到数据库单独调用正在为每个父母所作出
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的节目记录返回所有需要的数据
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属性是IQuerierable<Child>
,必须查询它以公开Child对象。
被引用的问题似乎没有解决我的情况。使用db.LoadOptions不起作用。也许它要求类型是用DataContext注册的TEntity。
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
请注意:父母与子女是简单类型,不Table<TEntity>
类型。父母与子女之间没有上下文关系。子查询是特设的。
问题的关键:在第二个LINQ示例中,我实现了IQueriable
语句,并且不会调用ToList()
函数,并且出于某种原因,LINQ知道如何生成一个可以检索所需数据的单个查询。我如何使用实际数据填充我的临时投影,就像在第一个查询中完成的一样?另外,如果有人能帮助我更好地说出我的问题,我将不胜感激。
“Child”如何成为“简单类型”?它应该是一个映射类型。并且'parenttable'是一个'Table'还是前一个linq查询的结果?一些linq语句会导致L2S从连接切换到N + 1。 – 2013-04-26 20:09:06
重复标记:你知道实体框架和LINQ到SQL的区别吗? – 2013-04-27 06:54:52
@GertArnold虽然EF/L2S的LINQ部分经常会使功能上类似的问题重复,但在这种情况下,我相信你是完全正确的;他们不是重复的。重启。 – 2013-04-29 13:48:03