簡體   English   中英

如何使用下拉列表值(String)來過濾linq結果?

[英]How can I use drop down list value (String) to filter linq results?

我正在使用以下內容填寫下拉列表:

var columnNames = db.Mapping.MappingSource.GetModel(typeof(StaffDirectoryDataContext))
                                    .GetMetaType(typeof(Person)).DataMembers;

然后我將其轉換為List<String>以填充下拉列表。

然后,我希望能夠根據用戶的選擇獲得一組結果。 例如,如果他們從下拉列表中選擇“First name”並在文本框中鍵入“Bob”,我想運行LINQ查詢,其中first name = bob。

我可能很厚但我找不到辦法! 偽代碼會......

var q = from x in dc.Persons
        where x.[selected column name] == [textbox value]
        select x;

有人可以幫忙嗎? 基本上我有列名作為字符串值,我無法弄清楚如何告訴LINQ查詢這是要過濾的列!

我可以閉着眼睛在ADO.NET中做到這一點,但決定一直使用LINQ !!

提前致謝。

David Buchanan使用反射發布了此問題的解決方案:

msdn論壇

我不確定你能動態地做到這一點,但你可以有條件地做到這一點。 像這樣的東西:

switch(selected column name)
{
    case "student_no":
       q = q.where(p=>p.StudentNo == value);
       break;

    case "student_id":
       q = q.where(p=>p.StudentId == value);
       break;
}

您可以遍歷列並繼續構建數據。 只要沒有任何調用強制執行IQueryable,就不會執行SQL。

我認為表達樹是正確的方法,但我不太了解它們,所以如果我不想學習表達樹構建,我會給你另類的方法。

public interface IFilter { IEnumerable RetreiveFilter(string filterValue); }

public class FirstNameFilter : IFilter
{
    private const string FILTER_TYPE_NAME = "First Name";
    public IEnumerable RetreiveFilter(string filterValue)
    {
        return _myData.Where(person => person.FirstName = filtervalue);
    }

    public override string ToString()
    {
        return FILTER_TYPE_NAME;
    }
}

為每個過濾器類型創建一個這樣的類,然后用這些過濾器填充你的下拉列表,當他們在過濾器文本中鍵入info時,它將針對((IFilter)filterDropDown.SelectedItem).RetreiverFilter(filterTextBox.Text);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM