2010-11-17 63 views
2

我有我想查询预编译,但正在执行的查询已经存在的ObjectQuery如下: -实体框架只支持标量类型

ObjectQuery<Books> books = _ctx.Books.Include("Authors"); 

books = books.Where(book=>book.Vendor.Listing.Select(vend=>vend.Price > 200)); 

我想用为第二个查询编译的查询,但这需要将“books”对象传递给编译查询的“Invoke”方法,当我尝试执行时会抛出一个错误,指出“仅支持标量类型”,因为“books”是ObjectQuery类型。

所以我真的不能做这样的事情: -

var results = QueryCache.GetVendorFilter.Invoke(context,books); 

其中,GetVendorFilter是编译的查询。

有没有其他方法可以编译这个查询?有谁知道EF4是否有这个限制?

回答

1

我的理解是,编译后的查询基本上预先为您的查询表达式构建SQL语句,但保留参数值未定义。由于SQL不支持将另一个查询用作参数,因此对于我来说,您无法做到这一点。

预编译查询需要注意的一件事是,当你对它们做任何事情时,它们变成“只是另一个查询”,当你评估它时,它必须重新编译。所以即使你只是在最后拨打.Take(10),你已经失去了预编译查询的价值。

由于您的books查询已经修复得很多,不过应该很容易为这个特定的场景创建一个单独的预编译查询。