Использование IQueryable или IEnumerable в моем методе действия поиска - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть следующий метод действия: -

          [AcceptVerbs(HttpVerbs.Post)]
             public PartialViewResult Search(string q, int classid)
            {

                var users = r.searchusers(q, classid);
// code does here..............

, который вызывает следующий метод репозитория модели: -

public IQueryable<User> searchusers(string q, int id)
        {
            return from u in entities1.Users
                 where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
                   select u;
}

теперь, если я изменю IQueryable на IEnumerable следующим образом, будут ли какие-либо изменения в том, как будет выполняться запрос в этом случае ?: -

public IEnumerable<User> searchusers(string q, int id)
        {
            return from u in entities1.Users
                 where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
                   select u;
}

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Да, в моем тестировании, когда вы приводите IEnumerable, это определяет SQL запроса. Любая дополнительная композиция запроса, которую вы выполняете после этого, будет сделана в памяти после выполнения запроса.

Предположим, у вас есть базовый запрос, который загружает список пользователей и возвращает IEnumerable. Затем, прежде чем вы на самом деле выполните этот список (тем самым выполняя запрос), вы также добавляете .Where (i => i.username = 'bob'). В этом случае он выполнит весь выбор, а затем применяет LINQ-to-Objects в фильтре памяти для части "где имя пользователя = 'bob'", что, вероятно, не то, что вы хотите, вместо этого вы хотите, чтобы все это запускаться как часть инструкции SQL.

Так что да, всегда используйте IQueryable, когда вы можете, чтобы ваши полностью собранные композиции запускались сразу.

1 голос
/ 12 февраля 2012

Да, это изменит запрос, вы хотите использовать IQuerable для всего, что использует удаленный источник данных.

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

Я обычно применяю IEnumerable на границе уровня, где я не хочу, чтобы люди модифицировали запросы, которые выполняет система.генерировать.

...