在linq where子句中计算列名

在linq where子句中计算列名,linq,where,dto,Linq,Where,Dto,如果我遗漏了一些明显的东西,我深表歉意 我正在尝试定制一种方法来创建一个RadComboBox过滤器,它可以根据用户类型进行调整(基于Telerik演示)。我使用业务逻辑层来插入数据源,然后我尝试使用linq为组合框OnItemRequested选择值,具体取决于哪个组合框提出了请求。我试图在“where”子句中根据GridColumn筛选器发出请求来设置参数 以下是我填写列表的代码: private void list_ItemsRequested(object o, RadComboBoxI

如果我遗漏了一些明显的东西,我深表歉意

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

以下是我填写列表的代码:

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();
    }
是否需要将UniqueName强制转换为数据对象(EmployeeDTO)中的参数

谢谢

更新:: 多亏了反馈,我在填充组合框列表方面取得了一些成功。然而,我认为我的linq声明中仍然有一个错误。这个列表是第一次构建的,但是,当我尝试进行“StartsWith”比较时,页面会抛出一个错误,说数据源不包含数据行,即使我确实键入了一个“finable”字符串

这是我现在拥有的

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();
    }
private void list\u请求的项目(RadComboBox o、radcomboboxitemsrequestedventargs e)
{
o、 DataTextField=this.DataField;
o、 DataValueField=this.DataField;
DataTable dt=EmployeeBL.GetAllEmployees().AsDataTable();
IEnumerable查询=
来自dt.AsEnumerable()中的emp
其中emp.Field(this.UniqueName).StartsWith(e.Text)
选择emp;
DataTable boundTable=query.CopyToDataTable();
o、 数据源=边界表;
o、 数据绑定();
}

没有内置的方法。您有一些选择:

  • 使用动态Linq查询库,如
  • 使用反射从属性名称中删除
  • 使用
    switch
    语句从已知属性列表中选择表达式(易于编码,动态性较低)
  • 使用extension方法创建一个数据表,该表支持基于字符串的排序/过滤

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

如果您确定
o
是一个
RadComboBox
,那么它也可以这样传入

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();
}
private void list\u请求的项目(RadComboBox o、radcomboboxitemsrequestedventargs e)
{
o、 DataTextField=this.DataField;
o、 DataValueField=this.DataField;
PropertyInfo property=typeof(EmployeeDTO).GetProperty(this.UniqueName);
var employees=来自EmployeeBL.GetAllEmployees()中的emp
其中((IQueryable)(property.GetValue(emp)))包含(e.Text)
选择emp;
o、 数据源=员工;
o、 数据绑定();
}

您实际上应该只铸造一次
o
,并在整个方法中使用键入的结果。这是一个巨大的性能损失,也是一个真正的视觉障碍…更不用说代码的可读性:)我很欣赏速度和风格点的评论。(我对这个很陌生。)关于如何在WHERE子句中计算“this.UniqueName”有什么想法吗?
GetAllEmployees
返回什么类型?我假设
IQueryable
,但要确保@DStanley,它返回一个
列表
。我假设
是这样的。UniqueName
引用了一个属性名,因为OP声明它是网格中的一列。谢谢@DStanley。我已将其更改为属性并添加了缺少的演员阵容。我从未使用过反射。。。但是我尝试了你的建议,Intellisense说,
property
没有GetValue方法。我基本上是尝试将员工列表加载到组合框(配置为筛选值列表)中,当用户开始键入时,该值将在
where
子句中计算。我从
GetAllEmployees()
返回的是一个列表。不确定这是否影响了
属性info
冲突。Thx.
属性
类型确实有一个
GetValue
方法。错误可能是说被调用的实际属性不存在。此代码要求在
EmployeeDTO
中有一个类型为
IQueryable
的属性,其名称在您的
UniqueName
@matthewstrobbridge中指定。我对此完全陌生,但我真的想了解您的建议,b/c我想我很接近了。如果可以的话,你能告诉我你的例子里发生了什么吗?我认为,正如您所建议的,在
EmployeeDTO
上的
属性
查找与列值中实际匹配的内容之间存在冲突。我希望在列中的值(例如,FullName既是
EmployeeDTO的
属性
,也是GridColumn
this的
唯一名称
)与输入到
组合框中的文本(
e.text
)之间进行匹配。谢谢,我忘了ToDataTable扩展。我试试看。