好的,我需要在这里进行健全检查......
我编译了一个在执行时返回IQueryable的查询。
在以下示例中,查询实际应对数据库执行哪些行?
101 IQueryable<T> results = MyCompiledQuery(MyDataContext);
102 List<T> final = (from t in result
103 where t.ID > 5
104 select t).ToList<T>();
以下是我定义编译查询的方法
public static Func<MyDataContext, IQueryable<Widget>> MyCompiledQuery=
CompiledQuery.Compile<MyDataContext, IQueryable<Widget>>(
(MyDataContext db) =>
from w in db.Widgets
where ((w.Type == WidgetType.Atype || //Widget.Atype is a Linq to Sql object, that I've defined statically
w.Type == WidgetType.Btype || //See above comment
w.Type == WidgetType.Ctype ) && //See above comment
w.Location == WidgetLocation.Domestic) //Samething applies here
select euc);
进一步讨论请参阅: LINQ to SQL compiled queries and when they execute
答案 0 :(得分:2)
“在第104行,进行ToList转换时。”
嗯,这个答案是错误的。我们调用存储在第101行的MyCompiledQuery变量中的委托,它返回编译查询的结果,而不是查询本身。
答案 1 :(得分:2)
它在第104行执行(当你调用ToList()时)。
编译后的查询是一个在编译时只翻译一次到TSQL的查询,而不是每次执行之前。
答案 2 :(得分:1)
此查询在第101行执行。我通过执行SQL事件探查器跟踪来验证它。我想这是因为它是一个编译的查询。
您正在进行的过滤&gt; 5是在记忆中完成的。
答案 3 :(得分:0)
这称为延期执行 你可以在上面阅读一篇好文章here。
答案 4 :(得分:0)
据我所知,IQueryable永远不会被执行,它只是将Linq查询转换为可查询格式,以便在请求时执行它。
在这种情况下,我想它要求转换为List的时刻会查询结果。关于第102和104行的争论毫无意义,因为两者都代表一条线。