嗨,我在c#中创建一个winform应用程序。
我使用EF5处理数据库。
为了将数据绑定到我的datagridviews,我从BindingSource创建了一个组件,该组件具有运行此事件的Bind()方法:
private object bindingSourceTbl1_DataSourceBinding(object sender, EventArgs e)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
return(from x in dbo.Tbl1
where x.Id == (int)comboBoxPerson.SelectedValue
select x).Take(1000).ToList();
}
}
因为我的数据库有很多大数据,所以我只能提取部分数据。我用搜索来获取比赛记录。为此,我创建了一个SearchPanel组件,该组件创建了用于过滤网格中各列的文本框。
现在,我想将表达式树作为参数发送到我的事件,以加入到where子句中,如下所示:
private object bindingSourceTbl1_DataSourceBinding(object sender, EventArgs e,Expression whereClause)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
return(from x in dbo.Tbl1
where x.Id == (int)comboBoxPerson.SelectedValue && whereClause
select x).Take(1000).ToList();
}
}
但是我的表达式树生成器方法存在于我的组件代码中,并且我无法访问我的项目中的DbContext,而我的组件中只有fieldNames,我也想为所有表编写一种方法。
这意味着我不能像
表达式<Func <AnyDbSet,bool >>
我不知道怎么办?
谢谢
如果你只需要&&
,那么它有助于认识到,coll.Where(x => a(x) && b(x))
(这里a(x)
和b(x)
任何布尔表达式,与工作x
),在逻辑上是一样的coll.Where(x => a(x)).Where(x => b(x))
。这意味着您可以将代码重写为:
List<Tbl1Type> GetTbl1Values(Expression<Func<Tbl1Type, bool>> whereClause)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
return dbo.Tbl1
.Where(x => x.Id == (int)comboBoxPerson.SelectedValue)
.Where(whereClause)
.Take(1000).ToList();
}
}
如果还需要支持||
或更复杂的组合,则可以使用LINQKit。
这只是从属性名称创建表达式的问题。您可以Expression
为此使用类型的方法。例如,类似:
static Expression<Func<T, bool>> CreateWhereClause<T>(
string propertyName, object propertyValue)
{
var parameter = Expression.Parameter(typeof(T));
return Expression.Lambda<Func<T, bool>>(
Expression.Equal(
Expression.Property(parameter, propertyName),
Expression.Constant(propertyValue)),
parameter);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句