考虑以下查询,是否会导致多次访问db以执行内部select语句?
Table1.Select(x=> new{
x.T1_Name,
x.T1_Id,
T2 =x.Table2.Select(y=> new {
y.T2_Name,
y.T2_Value
})
}).ToList();
我的猜测是它不会,因为它仍然是IQueryable
,整个查询将在DB上运行,最终结果将传递给客户端。
在LinqPad
中,内部查询会触发对服务器的多次调用。
答案 0 :(得分:0)
我敢打赌Table1
是在先前查询中获得的列表,其中包含对Table2
的引用。由于它是一个列表,因此已设置初始查询的结果。但是它没有实现Table2
结果的内容,因此它现在将出现在这些查询中。
可能是这样的:
var Table1 = context.Table1.ToList(); // materialize Table1
var query = Table1.Select(x=> new{
x.T1_Name,
x.T1_Id,
T2 =x.Table2.Select(y=> new { // Table2 not materialized, so do it now
y.T2_Name,
y.T2_Value
})
}).ToList();
删除这些ToList()
来电,直到您真正需要它为止。它阻止了查询提供程序完成其工作。