是否可以在不调用数据库的情况下创建空IQueryable的实例?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在不调用数据库的情况下创建空IQueryable的实例?相关的知识,希望对你有一定的参考价值。

打电话给datacontext.Things将返回IQueryable<Thing>。但在我的情况下,活跃用户可能没有权利看到任何东西。在这种情况下,我想从我的存储库中返回一个空的IQueryable of Things。直到现在我还在使用

return new Enumerable.Empty<Thing>.AsQueryable();

拉下这个,这个工作得很好。

我们做了一些开发,现在,稍后,Queryable将与另一个IQueryable连接。执行该操作会引发以下异常:

An IQueryable that returns a self-referencing Constant expression is not supported.

发生这种情况是因为linq无法加入实际的IQueryable,其行为类似于IQueryable,但实际上是一个Enumerable。

我已经在SO上寻找解决方案来解决这个问题,而我找到的唯一替代方案是使用

return datacontext.Things.Take(0);

尽管这样可以解决上面的问题,因为它返回了一个实际的IQueryable,我认为它实际上也调用了数据库,这似乎是一个不必要的时间,因为我事先知道该调用不会返回任何记录。或者linq2Sql足够聪明,不能实际执行此查询?

有没有办法创建一个空的IQueryable仍然可以在连接中使用而不调用数据库?

答案

Take返回一个查询,而不是该查询的结果。因此,它不与数据库交互。只有在您迭代它时才会执行查询并访问结果,如果查询被定义为需要,则可能与数据库进行交互。

在您的情况下,您显然正在使用该查询将其与另一个查询组合在一起,因此只有新的复合查询在执行时才会实际与数据库进行交互。

除非您有时会迭代返回的值,有时会将其组合成更复杂的查询。在那种情况下,你可能只需要......不要这样做。您正在使用的查询框架只允许您撰写查询,如果迭代,将实际查询数据库。你当然可以编写自己的查询框架,但行为方式不同,但这非常重要。

以上是关于是否可以在不调用数据库的情况下创建空IQueryable的实例?的主要内容,如果未能解决你的问题,请参考以下文章

在不调用构造函数的情况下创建 Vector 元素

是否有可能在不快速调用 API 的情况下从互联网获取图像?

是否可以在不使用malloc的情况下进行内存泄漏?

是否可以在不调用新活动的情况下获取对象值?

是否可以在不实际渲染画布的情况下创建画布来提取图像数据?

是否可以在不调用“节点”的情况下运行 Node.js 脚本?