Это фильтры в памяти, верно? - PullRequest
0 голосов
/ 29 ноября 2011

Я просто хочу убедиться, что я правильно понимаю ...

search - это объект, который содержит строку запроса.

Repo.Query возвращает ObjectQuery<T>.

Насколько я понимаю, цепочечные операторы linq отфильтруют результаты после того, как каркас сущности вернет все строки, удовлетворяющие запросу.Так что действительно ВСЕ строки возвращаются и затем фильтруются в памяти.Таким образом, мы возвращаем кучу данных, которые нам не нужны.Возвращается около 10 тысяч строк, так что это очень важно.Так же, как прояснить мою путаницу.

var searchQuery = Repo.Query(search)
                .Where(entity =>
                        entity.Prop1.ToUpper().Equals(prop1.ToUpper()) &&
                        entity.Prop2.ToUpper().Equals(prop2.ToUpper()))
                .OrderBy(entity => Repo.SortExpression ?? entity.prop1);

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Если это SQL, это, скорее всего, создаст SQL-запрос и фильтр на сервере, а не в памяти.

На самом деле, вышеприведенное утверждение на самом деле ничего не сделает. Только когда вы выполните итерацию, запрос будет выполнен. Вот почему некоторые поставщики (например, EF to SQL) могут свернуть деревья выражений в запрос SQL.

Самый простой способ проверить это - использовать LINQPAD или SQL Profiler, чтобы увидеть, какой запрос фактически выполняется.

1 голос
/ 29 ноября 2011

Ваша функция Repo.Query(string query) должна возвращать IQueryable<T>.

Затем вы можете фильтровать и упорядочивать, не получая сначала все строки.

Интерфейс IQueryable (Of T)

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...