Предположим, у меня есть выражение IQueryable<T>
, в которое я хотел бы инкапсулировать определение, сохранить его и повторно использовать или встроить в более крупный запрос позже. Например:
IQueryable<Foo> myQuery =
from foo in blah.Foos
where foo.Bar == bar
select foo;
Теперь я считаю, что могу просто сохранить этот объект myQuery и использовать его, как я описал. Но в некоторых вещах я не уверен:
Как лучше всего его параметризовать? Сначала я определил это в методе, а затем возвратил IQueryable<T>
в качестве результата метода. Таким образом, я могу определить blah
и bar
как аргументы метода, и я предполагаю, что он просто создает новый IQueryable<T>
каждый раз. Это лучший способ инкапсулировать логику IQueryable<T>
? Есть ли другие способы?
Что если мой запрос будет преобразован в скаляр, а не IQueryable
? Например, что если я хочу, чтобы этот запрос был точно таким, как показано, но добавьте .Any()
, чтобы просто сообщить мне если были какие-либо результаты, которые соответствовали? Если я добавлю (...).Any()
, то результат будет bool
и сразу будет выполнен, верно? Есть ли способ использовать эти Queryable
операторы (Any
, SindleOrDefault
и т. Д.) Без немедленного выполнения? Как LINQ-to-SQL справляется с этим?
Редактировать: Часть 2 на самом деле больше о попытках понять, в чем различия между IQueryable<T>.Where(Expression<Func<T, bool>>)
и IQueryable<T>.Any(Expression<Func<T, bool>>)
. Кажется, что последний не так гибок при создании больших запросов, где выполнение должно быть отложено. Where()
может быть добавлено, а затем могут быть добавлены другие конструкции и, наконец, выполнены. Поскольку Any()
возвращает скалярное значение, звучит так, как будто оно будет немедленно выполнено до того, как будет построен остальной запрос.