在linq where子句中评估列名

时间:2013-02-05 20:47:43

标签: linq where dto

如果我在这里遗漏了一些明显的东西,我表示歉意....

我正在尝试自定义一种创建RadComboBox过滤器的方法,该过滤器可以根据用户类型进行调整(基于Telerik演示)。我正在使用业务逻辑层来提取我的数据源,然后我尝试使用linq来选择组合框OnItemsRequested的值,具体取决于哪个组合框发出了请求。我正在尝试根据GridColumn过滤器发出请求在“where”子句中设置参数。

这是填写列表的代码:

private void list_ItemsRequested(object o, RadComboBoxItemsRequestedEventArgs e)
    {
        ((RadComboBox)o).DataTextField = this.DataField;
        ((RadComboBox)o).DataValueField = this.DataField;
        var employees = from emp in EmployeeBL.GetAllEmployees()
                        where emp.(this.UniqueName).Contains(e.Text)
                        select emp;
        ((RadComboBox)o).DataSource = employees;
        ((RadComboBox)o).DataBind();
    }

我是否需要在我的数据对象(EmployeeDTO)中将UniqueName转换为参数?

感谢。

UPDATE :: 感谢您的反馈,我在填充组合框列表方面取得了一些成功。但是,我认为我的linq声明中仍然存在误导。该列表第一次构建,但是,当我尝试进行“StartsWith”比较时,该页面抛出错误,指出数据源不包含数据行,即使我肯定键入“findable” “字符串。

这就是我现在所拥有的。

private void list_ItemsRequested(RadComboBox o, RadComboBoxItemsRequestedEventArgs e)
    {
        o.DataTextField = this.DataField;
        o.DataValueField = this.DataField;

        DataTable dt = EmployeeBL.GetAllEmployees().AsDataTable();

        IEnumerable<DataRow> query =
            from emp in dt.AsEnumerable()
            where emp.Field<String>(this.UniqueName).StartsWith(e.Text)
            select emp;

        DataTable boundTable = query.CopyToDataTable<DataRow>();
        o.DataSource = boundTable;
        o.DataBind();
    }

2 个答案:

答案 0 :(得分:1)

没有内置方式。你有一些选择:

  • 使用动态Linq查询库,例如ScottGu's
  • 使用属性名称
  • 中的反射到build an Expression
  • 使用switch语句从已知属性列表中选择表达式(易于编码,动态性较差)
  • 使用CopyToDataTable扩展方法创建 支持基于字符串的排序/过滤的数据表DataViews

答案 1 :(得分:1)

您是否尝试在每个员工上调用this.UniqueName中指定的方法,并查看结果是否包含文本?是这样,你可以使用反射。

如果您确定oRadComboBox,那么它也可以传入。{/ p>

private void list_ItemsRequested(RadComboBox o, RadComboBoxItemsRequestedEventArgs e)
{
    o.DataTextField = this.DataField;
    o.DataValueField = this.DataField;

    PropertyInfo property = typeof(EmployeeDTO).GetProperty(this.UniqueName);
    var employees = from emp in EmployeeBL.GetAllEmployees()
                    where ((IQueryable<string>)(property.GetValue(emp))).Contains(e.Text)
                    select emp;
    o.DataSource = employees;

    o.DataBind();
}