如何使用下拉列表值(String)来过滤linq结果?

时间:2010-08-23 13:48:18

标签: c# linq

我正在使用以下内容填写下拉列表:

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 !!

提前致谢。

3 个答案:

答案 0 :(得分:1)

David Buchanan使用反射发布了此问题的解决方案:

msdn forum

答案 1 :(得分: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;
}

您可以遍历列并继续构建数据。只要没有任何调用强制执行IQueryable,就不会执行SQL。

答案 2 :(得分: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;
    }
}

为每种过滤器类型创建一个这样的类,然后使用这些过滤器填充下拉列表,当他们在过滤器文本中键入info时,它将针对((IFilter)filterDropDown.SelectedItem).RetreiverFilter(filterTextBox.Text);

执行