在linq where子句中计算列名
如果我遗漏了一些明显的东西,我深表歉意 我正在尝试定制一种方法来创建一个RadComboBox过滤器,它可以根据用户类型进行调整(基于Telerik演示)。我使用业务逻辑层来插入数据源,然后我尝试使用linq为组合框OnItemRequested选择值,具体取决于哪个组合框提出了请求。我试图在“where”子句中根据GridColumn筛选器发出请求来设置参数 以下是我填写列表的代码:在linq where子句中计算列名,linq,where,dto,Linq,Where,Dto,如果我遗漏了一些明显的东西,我深表歉意 我正在尝试定制一种方法来创建一个RadComboBox过滤器,它可以根据用户类型进行调整(基于Telerik演示)。我使用业务逻辑层来插入数据源,然后我尝试使用linq为组合框OnItemRequested选择值,具体取决于哪个组合框提出了请求。我试图在“where”子句中根据GridColumn筛选器发出请求来设置参数 以下是我填写列表的代码: private void list_ItemsRequested(object o, RadComboBoxI
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的属性
,也是GridColumnthis的唯一名称
)与输入到组合框中的文本(e.text
)之间进行匹配。谢谢,我忘了ToDataTable扩展。我试试看。