我有一個看起來像這樣的搜索形式:動態Where子句lambda表達式在C#
形式背後的代碼如下所示:
@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>
}
我想要做的就是從返回選項動態構造一個lambda where子句。例如。如果用戶選擇「過程中沒有」和「包含」,那麼拉姆達會是什麼樣
model.DataSource = _db.InstrumentLists.Where(x => x.Process_No.Contains(SearchTerm));
或者,如果用戶選擇「PLC否」和「等於」,那麼拉姆達會是什麼樣
model.DataSource = _db.InstrumentLists.Where(x => x.PLC_No == SearchTerm);
我試圖做到這一點,同時避免大的case語句或如果堆棧,即我不希望做如下:
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>
。
用我的目標更新了我的問題,請參閱粗體部分。 – link664
你可以用動態Linq來完成大部分工作 - 它需要一個你構造的字符串......就像我的例子 - 搜索的屬性/字段直接從字符串SelectedType和SearchTerm中獲取,Weher被調用字符串並對SelectedType/SearchTerm的任意組合執行此操作...查看我答案中的鏈接... – Yahia