Linq динамически добавляет, где условия

У меня есть gridview, который имеет выпадающие окна в каждом заголовке для фильтрации. Каждый фильтр загружается с различными значениями из своего столбца при загрузке. Во время выполнения добавляюВСЕ" чтобы позволить пользователю выбрать все из этого поля. Я пытаюсь построить оператор linq динамически, чтобы игнорировать поле, если раскрывающийся список установлен на "ВСЕ", Это возможно? Я хочу посмотреть, смогу ли я сделать это в одном заявлении. В приведенном ниже примере показаны только 2 выпадающих списка, но в моем случае до 5.

Если я решу использовать операторы if then, я получу код спагетти.

DropDownList drpOwners = this.grdOtherQuotes.HeaderRow.FindControl("drpOwners") as DropDownList;                     
DropDownList drpCompanyName = this.grdOtherQuotes.HeaderRow.FindControl("drpCompanyName") as DropDownList;

var filteredList = (from x in allQuotes
                          where (drpOwners.SelectedValue != ALL) ? x.SalesRepFullName == drpOwners.SelectedValue:true                                    
                                && drpCompanyName.SelectedValue != ALL ? x.CompanyName == drpCompanyName.SelectedValue: true
                          select x);
 Parwej16 окт. 2012 г., 18:48
Вы пробовали linqkit?albahari.com/nutshell/linqkit.aspx

Ответы на вопрос(3)

Вы можете создать вспомогательный метод, который обрабатывает логику All. Что-то вроде:

private bool CompareSelectedValue(string value, string dropDownValue)
{
  if(dropDownValue == "ALL")
    return true;
  else
    return value == dropDownValue;
}

Тогда ваш запрос может быть:

var filteredList = (from x in allQuotes
                          where (CompareSelectedValue(x.SalesRepFullName, drpOwners.SelectedValue)                                    
                                && CompareSelectedValue(x.CompanyName, drpCompanyName.SelectedValue)
                          select x);
Решение Вопроса

Лично ябыло бы проще разобраться с этим:

IEnumerable filteredList = allQuotes;
// If using EF or LINQ to SQL, use: IQueryable filteredList = allQuotes;
if (drpOwners.SelectedValue != ALL) 
   filteredList = filteredList.Where(x => x.SalesRepFullName == drpOwners.SelectedValue);
if (drpCompanyName.SelectedValue != ALL) 
   filteredList = filteredList.Where(x => x.CompanyName == drpCompanyName.SelectedValue);
// More conditions as needed

Это действительно небольше, и этоНамного проще следовать.

Если вы действительно хотели иметь возможность написать это какодин лайнер"Вы можете сделать метод расширения для создания запроса. Например, если вы используете Entity Framework:

static IQueryable AddCondition(this IQueryable queryable, Func predicate, Expression filter)
{
     if (predicate())
         return queryable.Where(filter);
     else
         return queryable;
}

Это позволит вам написать это как:

var filteredList = allQuotes
                     .AddCondition(() => drpOwners.SelectedValue != ALL, x => x.SalesRepFullName == drpOwners.SelectedValue)
                     .AddCondition(() => drpCompanyName.SelectedValue != ALL, x.CompanyName == drpCompanyName.SelectedValue);

Конечно, вы могли бы пойти еще дальше и сделать версию, в которой жестко привязан предикат, чтобы проверить поле со списком "ВСЕ", делая предикат короче (просто поле со списком).

 ΩmegaMan16 окт. 2012 г., 18:47
Он основан на том факте, что возвращается IQueryable, поэтому предложения where не выполняются до тех пор, пока данные не потребуются. +1
 Reed Copsey16 окт. 2012 г., 18:48
@OmegaMan ОП не былне ясно лиallQuotes» являетсяIEnumerable или жеIQueryable - однако, это на самом деле будет работать с EF, где оригинал, вероятно, не будет (я нене думаю, что условные операторы в этом случае, где "где правда "Будем проезжать с EF)
 Reed Copsey16 окт. 2012 г., 19:10
@MystereMan Да, исправлено - я изначально написал мышление LINQ to Objects, затем изменил в последнюю минуту и забыл исправить - позаботился сейчас.
 Erik Funkenbusch16 окт. 2012 г., 19:05
@ReedCopsey - Ваш код вызовет выполнение запроса, потому что вы 'Вы используете Func <Т, бул>, Это должно быть выражение <Func <т, BOOL >>

Создайте метод (ы) расширения, который инкапсулирует логику where, чтобы она выглядела чище:

var filteredList = allQuotes.WhereDropOwnersAreContained()
                            .WhereCompanyIsContained()
                            ...
                            ;

Ваш ответ на вопрос