2012-02-12 58 views
0

我有以下操作方法: -使用的IQueryable或IEnumerable的我的搜索行動方法內

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

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

它調用下面的模型庫方法: - 如果我改變的IQueryable到

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

現在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

感謝您的回覆;你是否意味着如果我在我的應用程序中使用Ienumerable,那麼系統將從數據庫中檢索所有用戶對象,並在應用程序服務器級別應用where子句! BR – 2012-02-12 02:15:53

1

是的,在我的測試中,一旦你轉換爲IEnumerable,那決定了查詢SQL。在執行查詢後,您在內存中執行的任何其他查詢組合都將在內存中完成。

因此,假設您有一個基本查詢加載用戶列表並返回一個IEnumerable。然後,在實際運行該列表(從而執行查詢)之前,還需要添加一個.Where(i => i.username ='bob')。在這種情況下,它將執行整個選擇,然後在內存過濾器中應用「where username ='bob'」部分的LINQ-to-Objects,這可能不是您想要的,而是希望整個事情作爲SQL語句的一部分運行。

所以,當你可以的時候總是使用IQueryable,這樣你的組合就可以一次運行了。

+0

感謝您的回覆,但,這也成爲我的情況下有效,監守我在一個statment與entities1.Users應用「其中」條款,因此係統應在兩種情況下申請在where子句中的數據庫,, 我對嗎?。 – 2012-02-12 02:06:31

相關問題