2011-01-18 38 views
3

這似乎有點「多」,但是這是我撿!LINQ語法contains方法具有包容性的「過濾器」

的Envision與作爲用於用戶的包容性過濾器的CheckBoxList的形式。

此用戶填寫一個表格,在他們想要的過濾器檢查過哪些項目,並關閉他們去。

我在尋找中寫入以下LINQ語句簡潔的方式:

如果沒有物品進行檢查,顯示所有結果 其他 由用戶選擇過濾顯示結果

是它可能(如果是這樣,如何)寫這個而不使用基本上是相同查詢的條件語句,但沒有Contains方法?

我試圖把一個三元運算符在我的Where子句,但是編譯器不喜歡它。

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

   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

爲什麼不只是做:

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>>過濾器,並將其分配給一個「總是正確的」斷言或真正的過濾器取決於條件,但是由於涉及匿名類型,這會稍微困難。

+0

正想說同樣的話,但有相反,如果三元運營商。 :) –