假设我有一个IQueryable<T>
表达式,我想封装它的定义、存储它并重用它,或者稍后将它嵌入到更大的查询中。例如:
IQueryable<Foo> myQuery =
from foo in blah.Foos
where foo.Bar == bar
select foo;
现在我相信我可以保留那个 myQuery 对象并像我描述的那样使用它。但有些事情我不确定:
如何最好地对其进行参数化?最初我在一个方法中定义了这个,然后返回了
IQueryable<T>
作为方法的结果。这样我可以将blah
and定义bar
为方法参数,我猜它IQueryable<T>
每次都会创建一个新参数。这是封装逻辑的最佳方式IQueryable<T>
吗?还有其他方法吗?如果我的查询解析为标量而不是
IQueryable
怎么办? 例如,如果我希望这个查询与显示的完全一样,但追加.Any()
只是让我知道是否有任何匹配的结果?如果我添加(...).Any()
然后结果是bool
并立即执行,对吗?有没有办法在不立即执行的情况下利用这些Queryable
运算符(Any
,SindleOrDefault
等)?LINQ-to-SQL 如何处理这个问题?
编辑:第 2 部分实际上更多是关于尝试了解IQueryable<T>.Where(Expression<Func<T, bool>>)
与IQueryable<T>.Any(Expression<Func<T, bool>>)
. 在创建要延迟执行的较大查询时,后者似乎不那么灵活。Where()
可以附加,然后可以稍后附加其他构造,然后最终执行。由于Any()
返回一个标量值,听起来它会在构建查询的其余部分之前立即执行。