返回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行的争论没有任何意义,因为两者都代表一条线。