【问题标题】:LINQ IQueryable Check if Empty without EnumeratingLINQ IQueryable 检查是否为空而不枚举
【发布时间】: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


【解决方案1】:

有没有办法在不枚举的情况下检查 IQueryable 对象是否为空?

不,那是不可能的。

确定查询是否至少有一个结果的唯一方法是实际执行查询。您不需要迭代整个结果集,但您需要尝试获取第一项,这意味着将查询发送到数据库,让它执行它,然后发送响应。

如果您确实需要这样做,您可能最好将整个结果集拉入内存,放入一个列表,进行检查,然后返回 IEnumerable 而不是 IQueryable

那个,或者干脆不做检查。

【讨论】:

  • 这就是我一直在寻找的答案,一个简单的否 =) 我想我会留给调用者。
  • 为什么不AsEnumerable!那将在本地执行查询!
  • @Anirudh 这可能有什么帮助?您仍然需要转到数据库并执行查询。 AsEnumerable 有什么用?
  • @Anirudh 请重新阅读我的问题,这不是我要问的。
【解决方案2】:

在返回之前,您始终可以在 LINQ 语句中使用 .Any()。这样,如果您的语句没有返回任何内容,您将获得一个空值。

【讨论】:

  • 那是执行查询。此外,如果没有项目,它会导致一个空序列,而不是null,而Any 然后返回false,同样,不是null
  • 问题是我不想在返回之前评估查询。
  • @JNYRanger,您如何想象在不执行查询的情况下获得查询结果?我很困惑你是如何要求任何没有魔法的东西。
  • @JNYRanger 首先想想SQL query,你怎么能用SQL query 实现你想要的?至于翻译,问题可以这样重述How could I know if there is any data without having to execute the SQL query?
  • @Servy你误会了,请再看一遍,我也是说他不会
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多