假设我有一个IQueryable<T>
表达式,我想要封装它的定义、存储它并在以后重用它或将它嵌入到更大的查询中。例如:
IQueryable<Foo> myQuery =
from foo in blah.Foos
where foo.Bar == bar
select foo;
现在我相信我只需要保留 myQuery 对象并像我描述的那样使用它。但有些事情我不确定:
如何最好地参数化? 最初,我是在一个方法中定义的,然后将
IQueryable<T>
作为方法的结果返回。这样我就可以将blah
和bar
定义为方法参数,我想它只是每次创建一个新的IQueryable<T>
。这是封装IQueryable<T>
的逻辑的最佳方式吗?还有其他方法吗?如果我的查询解析为标量而不是
IQueryable
呢? 比如说,如果我希望这个查询与所示完全相同,但是添加.Any()
只是让我知道是否有任何匹配的结果?如果我添加了(...).Any()
,那么结果就是bool
并且立即执行,对吗?有没有一种方法可以利用这些Queryable
运算符(Any
、SindleOrDefault
等)而不立即执行?LINQ-to-SQL 如何处理这个问题?
编辑:第二部分实际上更多地是试图了解 IQueryable<T>.Where(Expression<Func<T, bool>>)
与 IQueryable<T>.Any(Expression<Func<T, bool>>)
之间的限制差异。似乎后者在创建需要延迟执行的更大查询时不太灵活。可以添加 Where()
,然后可以稍后添加其他结构,最后再执行。由于 Any()
返回一个标量值,因此它听起来会立即执行,而无法构建查询的其余部分。
IQueryable
的方法听起来是一件好事,因为这样我就不会遇到处理问题的麻烦。在#2中,我对LINQ-to-SQL如何转换Any
运算符感到困惑,但我不能推迟。如果我在较大的查询中使用Any
运算符,它是否也会立即执行,还是它是较大查询执行的一部分? - mckamey.Any()
嵌入到where
子句中,那么它不会在循环中执行,对吗?它会编译为适当的 SQL 表达式并发送下去。因此,实际上,不是.Any()
阻止了延迟执行,而是它的使用方式。基本上,如果整个查询的结果是标量,则编译器会认为您现在需要结果,而不是继续构建一个IQueryable<T>
。 - mckamey