2010-08-23 90 views
4

我使用下面的填充下拉列表:如何使用下拉列表值(String)過濾linq結果?

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

我然後轉換是一個List<String>來填充下拉列表。

然後我希望能夠得到一組基於用戶的選擇結果。例如,如果他們從下拉列表中選擇「名字」並在文本框中鍵入「Bob」,我想運行一個名爲= bob的LINQ查詢。

我可能是厚的,但我不能找到一種方法!僞代碼將...

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

任何人都可以幫忙嗎?基本上我有列名作爲一個字符串值,我不知道如何告訴LINQ查詢,這是過濾的列!

能夠在ADO.NET做到這一點我閉着眼睛,但決定使用LINQ一路!

在此先感謝。

+0

我不是太熟悉,建立表達式樹,但我認爲這正是諸如此類的事情,他們是爲了創造。鑑於不過,我仍然認爲通過適當地將對象映射到您的下拉列表中的項目這樣做的一個簡單而直接的機制應該能夠完成任務爲你.. – 2010-08-23 14:00:01

+0

其實,沒有遇到[DataContext的] .ExecuteQuery (字符串) 這是我將使用的,因爲它是我最簡單的選擇。向所有人道歉,因爲我的懶惰已盛行... Rob – LiverpoolsNumber9 2010-08-23 16:03:50

回答

1

大衛·布坎南已經張貼這個問題的解決方案使用反射:

msdn forum

+0

謝謝 - 完美的起點。回到學校雖然對我來說...... :) – LiverpoolsNumber9 2010-08-23 15:25:59

0

我不知道,你可以動態地做到這一點,但你可以有條件地做到這一點。類似這樣的:

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; 
} 

您可以迭代您的列並繼續構建wheres。只要沒有任何調用強制IQueryable執行,SQL就不會執行。

0

我覺得表達式樹是這樣做的正確方式,但我不知道他們很好,所以我要去給你另一種方式我會做這個,如果我不喜歡學習表達式樹的建築..

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; 
    } 
} 

每個濾波器類型創建一個類這樣,然後用這些過濾器填補你的下拉列表中,而當他們鍵入信息進入過濾文本,它將執行對((IFilter)filterDropDown.SelectedItem).RetreiverFilter(filterTextBox.Text);