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

时间:2019-04-12 15:50:12

标签: c# linq-to-sql 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,该IQueryable仍可以在联接中使用而无需调用数据库?

1 个答案:

答案 0 :(得分:0)

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

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

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