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

Is it possible to create an instance of an empty IQueryable without doing a call to the database?

调用 datacontext.Things 将 return 调用 IQueryable<Thing>。但在我的例子中,活跃用户可能无权查看任何 Thing。在这种情况下,我想 return 从我的存储库中获取一个空的 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);

尽管这解决了上述问题,因为它 return 是一个实际的 IQueryable,但我认为它实际上还对数据库进行了调用,这似乎是不必要的浪费时间,因为我事先知道该调用是不会 return 任何记录。或者 linq2Sql 是否足够聪明,不会实际执行此查询?

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

Take returns 一个查询,而不是该查询的结果。因此,它 与数据库交互。只有 if/when 你迭代它执行查询并访问它的结果,如果查询被定义为需要它,则可能与数据库交互。

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

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