Каждый IQueryable
содержит Expression
и Provider
.Expression
содержит запрос, который должен быть выполнен.Provider
знает, кто должен выполнить запрос, обычно это система управления базами данных.Задачей Provider
является перевод Expression
на язык, который понимает база данных (что-то вроде SQL), и выполнение запроса.Provider
будет эффективно извлекать результаты и возвращать запрошенные данные как перечисляемый объект.
IQueryable
реализует IEnumerable
.
Когда вы используете функции LINQ, такие как ToList()
, FirstOrDefault()
, Any()
или используйте запрос в foreach
, затем вызывается внутренне IEnumerable.GetEnumerator()
и Enumerator.MoveNext()
Это прикажет Provider
преобразовать Expression
в SQL и выполнить запрос.Возвращенное перечисление используется для перечисления по возвращаемым элементам.
Задача программиста класса, реализующего IQueryable
, реализовать преобразование Expression
в SQL.Это нелегко, и я думаю, что люди, создавшие Entity Framework, проделали большую работу.
Однако некоторые элементы, известные в SQL, очень сложно реализовать.Среди них понятия SoundEx и Difference.Я не уверен, но я думаю, что одна из причин, которые затрудняют это, заключается в том, что они обычно используются в SQL, а не в любых других системах IQueryable.
На самом деле, естьнесколько функций, которые не поддерживаются структурой объекта.См. Поддерживаемые и неподдерживаемые методы LINQ (LINQ для сущностей) .
Ваш DbContext является абстрактным представлением модели вашей базы данных.Пользователям его не должно волновать, использует ли он Microsoft SQL, MySQL, или же это сбор данных, который не использует ничего похожего на SQL.
Но если вы абсолютно уверены, что можно ограничить вашDbContext только для определенных типов баз данных, которые знают понятия SoundEx и Difference, рассмотрите возможность создания хранимой процедуры для вашего запроса.См. Как вызвать хранимую процедуру в Entity Framework