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

问题描述 投票:0回答:1

打电话给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仍然可以在连接中使用而不调用数据库?

c# linq-to-sql iqueryable
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.