返回IQueryable的编译查询何时执行?

好的,我需要在这里进行健全检查……

我编译了一个在执行时返回IQueryable的查询。

在以下示例中,查询实际应对数据库执行哪些行?

101 IQueryable results = MyCompiledQuery(MyDataContext); 102 List final = (from t in result 103 where t.ID > 5 104 select t).ToList(); 

这是我如何定义编译的查询

  public static Func<MyDataContext, IQueryable> MyCompiledQuery= CompiledQuery.Compile<MyDataContext, IQueryable>( (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 编译查询以及何时执行

它在第104行执行(当你调用ToList()时)。

已编译的查询是在编译时仅对TSQL进行一次转换的查询,而不是在执行之前的每次。

“在第104行,进行ToList转换时。”

嗯,这个答案是不正确的。 我们调用存储在第101行的MyCompiledQuery变量中的委托,它返回编译查询的结果,而不是查询本身。

此查询在第101行执行。我通过执行SQL事件探查器跟踪来validation它。 我想这是因为它是一个编译的查询。

在> 5之后进行的过滤在内存中完成。

这称为延期执行。
你可以在这里阅读一篇好文章。

据我所知,IQueryable永远不会被执行,它只是将Linq查询转换为可查询格式,以便在请求时执行它。

在这种情况下,我想当它被要求转换为List它查询结果的那一刻。 关于第102和104行的争论没有任何意义,因为两者都代表一条线。