Синтаксис LINQ для метода CONTAINS с включающим «фильтром» - PullRequest
3 голосов
/ 18 января 2011

Это может показаться немного "большим", но это меня раздражает!

Представьте форму с CheckBoxList, который действует как включающий фильтр для пользователя.

Этот пользователь заполняет форму, проверяет, какие элементы в фильтре они хотят, и выключает их.

Я ищу краткий способ написать следующее утверждение LINQ:

Если элементы НЕ отмечены, показать все результаты еще Показать результаты, отфильтрованные по выбору пользователя

Можно ли (и если да, то как) написать это без использования условного оператора, который в основном является тем же запросом, но без метода Contains?

Я пытался вставить троичный оператор в мое предложение Where, но компилятору это совсем не понравилось.

System.Collections.Generic.List catIds = new 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();

1 Ответ

3 голосов
/ 18 января 2011

Почему бы просто не сделать:

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>> и назначить его предикату «всегда истинно» или подлинному фильтру в зависимости от условия, но это будет немного сложнее, поскольку задействован анонимный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...