У меня есть форма поиска, которая выглядит следующим образом:
![search form](https://i.stack.imgur.com/MIo2A.jpg)
Код формы выглядит следующим образом:
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<div>
@Html.DropDownList("SelectedType", Model.TypeOptions)
@Html.DropDownList("SelectedSearch", Model.SearchOptions)
@Html.TextBoxFor(x => x.SearchTerm)
<input type="submit" value="Search" />
</div>
}
Что я хочуdo - это динамическое построение лямбда-выражения where из опций возврата.Например, если пользователь выбирает «Process No» и «Contains», то лямбда будет выглядеть как
model.DataSource = _db.InstrumentLists.Where(x => x.Process_No.Contains(SearchTerm));
Или если пользователь выбирает «PLC No» и «Equals», тогда лямбда будет выглядеть как
model.DataSource = _db.InstrumentLists.Where(x => x.PLC_No == SearchTerm);
Я пытаюсь сделать это, избегая большого оператора case или стека if, т.е. я не хочу следующее:
if (SelectedType == "Process No" And SelectedSearch = "Contains")
model.DataSource = _db.InstrumentLists.Where(x => x.Process_No.Contains(SearchTerm));
elseif (SelectedType == "Process No" And SelectedSearch = "Equals")
model.DataSource = _db.InstrumentLists.Where(x => x.Process_No == SearchTerm);
...
По сути, я хочу передатьссылка на свойство класса, что-то, чтобы указать тип теста (то есть содержит, равно, начинается с и т. д.) и поисковый термин для функции, или что-то в том же духе, и получить предикат для вставки в мое предложение Where.Я хочу, чтобы эта функция работала динамически, поэтому мне не нужно изменять ее для каждой комбинации свойства и типа теста.
Возможно ли это или является единственным способом использования Where с параметром предиката строки?
Редактировать : Если это важно, я использую EF для своей модели данных, поэтому _db.InstrumentLists возвращает ObjectSet<InstrumentList>
.