我正在将LINQ to SQL的结果投影到强类型类Parent和Child中。这两个查询之间的性能差异很大:
慢查询 - 从DataContext记录可以看出,每个父项都会进行一次单独的数据库调用。
我想强制LINQ使用第二个例子的单查询风格,但直接将Parent类填充为其Children对象。否则,Children属性是一个IQuerierable,必须查询才能暴露Child对象。
所引用的问题似乎没有解决我的情况。使用db.LoadOptions无法工作。也许它需要类型是已在DataContext中注册的TEntity。
请注意:Parent和Child是简单类型,不是Table类型。Parent和Child之间没有上下文关系。子查询是即席查询。
问题的核心:在第二个LINQ示例中,我实现了IQueryable语句,并且没有调用ToList()函数,但由于某种原因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
快速查询 - 从数据上下文的日志中可以看到只有一个数据库查询,返回所有所需数据
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使用第二个例子的单查询风格,但直接将Parent类填充为其Children对象。否则,Children属性是一个IQuerierable,必须查询才能暴露Child对象。
所引用的问题似乎没有解决我的情况。使用db.LoadOptions无法工作。也许它需要类型是已在DataContext中注册的TEntity。
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
请注意:Parent和Child是简单类型,不是Table类型。Parent和Child之间没有上下文关系。子查询是即席查询。
问题的核心:在第二个LINQ示例中,我实现了IQueryable语句,并且没有调用ToList()函数,但由于某种原因LINQ知道如何生成一个可以检索所有所需数据的单个查询。我该如何像第一个查询那样填充我的即席投影以获得实际数据?如果有人能帮我更好地表达我的问题,我将不胜感激。