1)
public class Query<T> : IQueryable<T> ...
{
...
public IEnumerator<T> GetEnumerator()
{
return((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();
}
}
Query<string> someQuery = new Query<string>();
someQuery.Expression
содержит дерево выражений, связанное с этим конкретным экземпляром IQueryable
, и, таким образом, описывает, как получить начальную последовательность элементов. В следующем примере переменная initialSet
фактически содержит последовательность строк:
string[] initialSet = { };
var results1 = from x in initialSet
where ...
select ...;
a) Может ли someQuery
также содержать последовательность строк или она может содержать только инструкции (в форме дерева выражений) о том, как получить эту начальную последовательность строк из некоторой БД?
b) Я предполагаю, что даже если someQuery
на самом деле содержит начальную последовательность строк, она бесполезна для операторов Where
и Select
, поскольку они никогда не будут работать с этой последовательностью строк, но вместо этого их работа состоит только в том, чтобы создавать запросы или запрашивать запросы к выполнению (вызывая IQueryProvider.Execute
)? И по этой причине someQuery
всегда должен содержать дерево выражений, описывающее, как получить начальную последовательность строк, даже если someQuery
уже содержит эту начальную последовательность?
Спасибо
EDIT:
в) Как я понял ваш пост, провайдер запросов может содержать информацию об описании таблицы или, по крайней мере, об описании отдельных строк БД, которые необходимо получить при первоначальном запросе. Но я не истолковал ваш ответ как высказывание о том, что поставщик запросов может также содержать фактические элементы, необходимые для этого начального запроса (someQuery
в нашем примере)?
d) Несмотря на это, я полагаю, даже если поставщик запросов поддерживает фактические элементы, он может поддерживать их только для первоначального запроса? Таким образом, если мы применяем операторы Linq-to-entity или Linq-to-Sql к этому начальному запросу, я предполагаю, что провайдеру придется запросить базу данных. Таким образом, если мое предположение верно, то ответ на b) будет даже если запрос содержит действительные элементы, когда мы вызываем Where
для someQuery
(someQuery.Where
), поставщик запросов должен будет извлекать результаты из БД, даже если этот поставщик запросов уже содержит все элементы someQuery
?
e) Я только начал изучать Linq-to-entity, поэтому мой вопрос может быть слишком общим, но как EF справляется со всем этим? Другими словами, когда ObjectSet<T>
, возвращаемый некоторым EF API (например, ObjectContext
), содержит фактические элементы и когда он (если когда-либо) содержит только логику для извлечения элементов из некоторого источника данных (например, БД)?
f) Кроме того, даже если ObjectSet<T>
(возвращаемое, скажем, ObjectSet
) действительно содержит фактические элементы, я предполагаю, что если мы применим к нему оператор Where (ObjectSet<T>.Where
), поставщик запросов всегда должен будет получать результаты из DB