【发布时间】:2013-10-24 14:27:42
【问题描述】:
这听起来像是一个荒谬的问题,但我在任何地方都找不到直接的答案。
我有一个从 LINQ-to-SQL 查询返回 IQueryable<MyObject> 对象的函数。我知道 IQueryable 对象利用惰性求值,所以我不想在返回对象之前使用.Count 枚举它。但是,我想在将其传回给调用者之前检查它是否不是“空”或空的。推理是,如果查询没有返回结果,则意味着调用者传递了一个无效参数,因此我想抛出一个异常。
这个问题:LINQ results when there are no matches? 似乎没有为我的这个问题的版本提供一个直接的答案。
我的问题是:有没有办法在不枚举的情况下检查 IQueryable 对象是否为空?检查default(IQueryable<T>) 会成功吗?
【问题讨论】:
-
我宁愿在将查询传回给调用者之前不对其进行评估。 Any 将评估查询。
-
@JNYRanger,你的问题有什么逻辑意义吗?你怎么知道查询是否会在不执行的情况下返回结果!?
-
不,没有办法在不运行查询的情况下查看任意查询是否返回任何结果。现在,您不必费心枚举整个查询或选择多个值,但
Any()会智能地做到这一点。 -
@TimS。当然,与通过网络与数据库通信所花费的时间相比,迭代内存集合的其余部分所花费的时间通常相形见绌,除非您的查询具有非常大的结果集。并不是说这是一个坏主意,但如果你真的只需要知道是否有任何物品。另请注意,在
IQueryable上使用Any会将查询更改为仅返回一项,从而使数据库执行和网络负载更快/更轻。 -
@KirkWoll 本质上,我试图找出是否有更快的方法来处理这个问题,而不是评估
IQueryable对象,然后将其传递回调用者并让他们使用它(再次)。基于 Servy 和 TimS 的 cmets,我将在函数中评估查询,然后将IEnumerable传递给调用者。感谢您的信息
标签: c# linq linq-to-sql lazy-evaluation