1

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フィルターといくつかの検索テキストフィルターを渡します。ExclusiveClassを適用した後、レコードの数が正しいことがわかりますが、検索フィルターを適用した後、基本的に既にフィルター処理されたアイテムがリセットされ、結果に戻ります。

4

1 に答える 1

3

はい、できます。IQueryable<T>「コンポーザブル」です。それはいいです。、、、などToList()のデータを必要とする何かを実行した場合にのみ、最終的に作成されたクエリが評価されます。このパターンは、多くのマルチフィールド検索画面が機能する方法とほぼ同じです。foreachCount()Max()

于 2012-07-03T12:07:17.860 に答える