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

时间:2009-09-18 15:52:29

标签: c# .net linq-to-sql

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

我编译了一个在执行时返回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

5 个答案:

答案 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行的争论毫无意义,因为两者都代表一条线。