调用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仍可以在联接中使用而无需调用数据库?
答案 0 :(得分:0)
Take
返回一个查询,而不是该查询的结果。因此,它不与数据库交互。只有/当您进行迭代时,查询才被执行并访问结果,如果定义了查询需要它,则有可能与数据库进行交互。
在您的情况下,您显然是在使用该查询将其与另一个查询进行组合,因此只有新的复合查询在执行时才会与数据库进行交互。
那是除非您有时迭代返回的值,有时将其组合成更复杂的查询。在这种情况下,您可能只需要...不这样做。您正在使用的查询框架将仅允许您组成查询(如果进行了迭代),这些查询实际上将查询数据库。当然,您可以编写自己的查询框架,这种查询框架的行为有所不同,但这将是不平凡的。