2010-08-23 85 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);