是否可以在不调用数据库的情况下创建空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的实例?的主要内容,如果未能解决你的问题,请参考以下文章