2011-01-18 12 views
3

これは少し "多すぎる"ように見えるかもしれませんが、これは私を拾っています!包含的な "フィルタ"を含むCONTAINSメソッドのLINQ構文

ユーザに包括的なフィルタとして機能するCheckBoxListを持つフォームを想定します。

このユーザーは、フォームに必要事項を入力し、必要なフィルタ内の項目をチェックし、オフにします。

私は、次のLINQ文を書くための簡潔な方法を探しています:

NO項目がチェックされていない場合は、すべてのユーザーの選択によってフィルタリング表示結果

を結果であることを示します基本的に同じクエリですが、Containsメソッドを使用しない条件文を使用せずにこれを書くことは可能でしょうか?

私はWhere節に三項演算子を入れようとしましたが、コンパイラはまったく好きではありませんでした。

System.Collections.Generic.List catIds = new System.Collections.Generic.List();

var filteredQry = catIds.Any() ? qry.Where(x => catIds.Contains(x.Id)) : qry; 
this.gvSchedule.DataSource = filteredQry.OrderBy(x => x.Category) 
             .ThenBy(x => x.Carrier) 
             .ToArray(); 

または::

if(catIds.Any()) 
    qry = qry.Where(x => catIds.Contains(x.Id)); 

this.gvSchedule.DataSource = qry.OrderBy(x => x.Category) 
           .ThenBy(x => x.Carrier) 
           .ToArray(); 

をあなたはまたExpression<Func<Foo, bool>>フィルタを使用して試してみて、「常に真」述語または本物のフィルタに割り当てることができだけでないのはなぜ

   foreach (ListItem lstItemCategory in lstCategories.Items) 
       { 
        if (lstItemCategory.Selected) 
        { 
         catIds.Add(Convert.ToInt64(lstItemCategory.Value)); 
        } 
       } 

       var qry = from rategroup in rategroups 
         from rate in rategroup.Rates 
         orderby rate.RateClass.Id descending 
         select new 
         { 
          Category = rate.Product.ProductCategories[0].Category.Description, 
          rate.Product.Description, 
          Carrier = rate.CarrierName, 
          Id = rate.Product.ProductCategories[0].Id 
         }; 


       this.gvSchedule.DataSource = qry.Where(x => catIds.Contains(x.Id)).OrderBy(x => x.Category).ThenBy(x => x.Carrier).ToArray(); 
       this.gvSchedule.DataBind(); 

答えて

3

条件に応じて、しかしこれは匿名のタイプが含まれているので、少し難しいでしょう。

+0

同じことを言うつもりでしたが、三項演算子の代わりにifを使用しました。 :) –

関連する問題