Можно ли создать экземпляр пустого IQueryable, не обращаясь к базе данных? - PullRequest
0 голосов
/ 12 апреля 2019

Вызов datacontext.Things вернет IQueryable<Thing>. Но в моем случае активный пользователь может не иметь прав на просмотр каких-либо вещей . В этом случае я хотел бы вернуть пустой IQueryable вещей из моего хранилища. До сих пор я использовал

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, который все еще можно использовать в соединении, не обращаясь к базе данных?

1 Ответ

0 голосов
/ 12 апреля 2019

Take возвращает запрос , а не результаты этого запроса. Таким образом, он не взаимодействует с базой данных. Только если / когда вы итерируете его, запрос выполняется и к нему обращаются результаты, потенциально взаимодействующие с базой данных, если запрос определен так, как он нужен.

В вашем случае вы, очевидно, используете этот запрос, чтобы составить его с другим запросом, так что только новый составной запрос, при выполнении, будет фактически взаимодействовать с базой данных.

Это так, если вы иногда итерируете это возвращенное значение, а иногда объединяете его в более сложные запросы. В этом случае вам, вероятно, нужно просто ... не делать этого. Используемая вами структура запросов позволит вам только составлять запросы, которые, если повторятся, фактически будут запрашивать базу данных. Конечно, вы могли бы написать свою собственную структуру запросов, которая бы работала по-другому, но это было бы очень нетривиально.

...