2012-07-03 100 views
1

有關使用IQueryable對象的快速問題。我可以做那樣的事情嗎?如果沒有,可以採用哪種方式?順序過濾IQueryable實例

IQueryable<Item> q = this.ObjectContext.items; 

q = q.Where(i => i.price > 100); 

... 

q = q.Where(i => i.class_name.Contain("apple")); 

更新:這裏是我的功能完整的代碼(可能是我想的東西):

public IQueryable<item> Getitem(string filter) 
{ 
    // filtering by user departments 
    IQueryable<item> pre_q = from t_item in this.ObjectContext.items 
     join t_useritems in this.ObjectContext.user_to_item on 
     t_item.number equals t_useritems.number 
     where t_useritems.user_name == this.userName 
     select t_item; 

    if (filter != null) 
    { 
     QueryFilter qf = new QueryFilter(filter); 
     string _excludeClass = qf.GetPropertyValueByName("excludeClass"); 
     string _excludeSubcat = qf.GetPropertyValueByName("excludeSubcat"); 
     string _searchBy = qf.GetPropertyValueByName("searchby"); 
     string _search = qf.GetPropertyValueByName("search"); 

     if (!string.IsNullOrEmpty(_excludeClass)) 
      pre_q = pre_q.Where(i => i.class_name != _excludeClass); 

     if (!string.IsNullOrEmpty(_excludeSubcat)) 
      pre_q = pre_q.Where(i => i.subcat_name != _excludeSubcat); 

     if (!string.IsNullOrEmpty(_searchBy) && !string.IsNullOrEmpty(_search)) 
     { 
      if (_searchBy == "number") 
       pre_q = pre_q.Where(i => i.number.Contains(_search)); 
      else if (_searchBy == "description") 
       pre_q = pre_q.Where(i => i.description.Contains(_search)); 
      else if (_searchBy == "class_name") 
       pre_q = pre_q.Where(i => i.class_name.Contains(_search)); 
      else if (_searchBy == "cat_name") 
       pre_q = pre_q.Where(i => i.cat_name.Contains(_search)); 
      else if (_searchBy == "subcat_name") 
       pre_q = pre_q.Where(i => i.subcat_name.Contains(_search)); 
      else if (_searchBy == "all_fields") 
       pre_q = pre_q.Where(i => i.number.Contains(_search) || 
        i.description.Contains(_search) || 
        i.class_name.Contains(_search) || 
        i.cat_name.Contains(_search) || 
        i.subcat_name.Contains(_search)); 
      } 
     } 
    } 
    return pre_q.OrderBy(i => i.number); 
} 

本質上發生了什麼 - 我通過excludeClass過濾器和一些搜索文本過濾器。在應用excludeClass後,我可以看到記錄的數量是正確的,但是當我在應用搜索過濾器後 - 它基本上重置已經過濾的項目,並且他們回到結果中。

+1

更新是好的,但仍然需要看到某種「這裏是我的輸入,這裏是我的TSQL,看起來:這個位應該被過濾,但它不是」 –

+0

這個方法調用excludeFilter = someName, searchBy = number,search = someText。如果searchBy和搜索沒有設置它工作正常 - 我收回只有class_name不是someName的記錄。但是,如果我傳遞searchBy/search,那麼我也會返回class_name == someName的記錄。我在哪裏可以獲得TSQL? – sha

+0

SQL跟蹤將是一個好的開始。如果這是LINQ到SQL,那麼可以非常輕鬆地得到它;與EF,只是SQL分析器更簡單。 –

回答

3

是的,你可以。 IQueryable<T>是「可組合的」。沒關係。它只會在您做某些需要數據的情況下評估最終組成的查詢,例如ToList()foreach或諸如Count(),Max()等的聚合。這種模式幾乎是如此多的多字段搜索屏幕工作。

+0

嗯...爲什麼它不起作用呢? :)在我的情況下,它看起來像應用第二個過濾器後 - 第一個消失... – sha

+0

堅持...你說count()?因此,如果我在中間添加「trace(q.Count())」,它會破壞它,對吧? – sha

+0

@sha你怎麼得出結論? SQL最終失效了,你是如何使用查詢的? (因爲你沒有向我們顯示) –