2012-02-12 1 views
0

У меня есть следующий метод действия: -Использование IQueryable Или IEnumerable внутри моего метода действия поиска

  [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; 
} 

ответ

1

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

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

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

+0

спасибо за ответ ур; do u означает, что если я использую Ienumerable в своем приложении, как описано выше, тогда система будет извлекать все пользовательские объекты из базы данных и применять предложение where на уровне сервера приложений !!! BR –

1

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

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

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

+0

спасибо за ваш ответ, но это также будет действительным в моем случае, потому что я применяю предложение «где» в одном статусе с сущностями. Пользователи должны применять предложение where в базе данных в двух случаях ,, я прав?. –