我有一个我想要预编译的查询,但是查询是在已经存在的ObjectQuery上执行的,如下所示: -
ObjectQuery<Books> books = _ctx.Books.Include("Authors");
books = books.Where(book=>book.Vendor.Listing.Select(vend=>vend.Price > 200));
我想对第二个查询使用编译查询,但是这需要将“books”对象传递给Compiled Query的“Invoke”方法,当我尝试这样做时会抛出一个错误,说“只有标量类型”支持“自”书籍“是ObjectQuery类型。
所以我真的不能这样做: -
var results = QueryCache.GetVendorFilter.Invoke(context,books);
其中,GetVendorFilter是一个已编译的查询。
还有其他方法可以编译此查询吗?有谁知道EF4是否有此限制?
答案 0 :(得分:1)
我的理解是,编译的查询基本上预先构建了查询表达式的SQL语句,但保留了参数值undefined。由于SQL不支持使用其他查询作为参数,因此我不能这样做。
使用预编译查询需要注意的一点是,当您对它们执行任何操作时,它们将成为“只是另一个查询”,在评估它时必须重新编译。因此,即使您最后调用.Take(10)
,也会丢失预编译查询的值。
由于您的books
查询几乎已修复,因此应该很容易为此特定方案创建单独的预编译查询。