我有两个表,一个父“Point”和一个子“PointValue”,由一个外键“PointID”连接,在SQL Server 2005中形成一对多的关系。
我有一个LINQ查询:
var points = from p in ContextDB.Points
//join v in ContextDB.PointValues on p.PointID equals v.PointID
where p.InstanceID == instanceId
orderby p.PointInTime descending
select new
{
Point = p,
Values = p.PointValues.Take(16).ToList()
};
从注释掉的连接和“值”赋值可以看出,“Point”表与“PointValue”有关系(LINQ称为“Points”和“PointValues”)。
当迭代“var points”IQueryable(比如,将它绑定到GridView等)时,初始查询非常快,但是迭代“Values”属性非常慢。 SQL事件探查器向我显示,对于“点”中的每个值,IQueryable执行另一个查询。
如何将此作为一个查询?
有趣的是,当取消注释连接时,初始查询会变得非常慢。
答案 0 :(得分:1)
我想你想使用DataLoadOptions.LoadWith方法,如下所述:
http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx
在您创建DataContext时,您将执行以下操作:
DataLoadOptions options = new DataLoadOptions();
ContextDB.LoadOptions = options;
options.LoadWith((Point p) => p.PointValues);
答案 1 :(得分:1)
您应该确保PointValues表在PointID列上有一个索引。