您好我在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,布尔>>
我不知道怎么做?
由于
答案 0 :(得分:7)
如果您只需要&&
,那么了解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);
}
答案 1 :(得分:0)
你可以使用dynamic linq。 这是一个例子:
var result = northwind.Products
.Where("CategoryID = 3 AND UnitPrice > 3")
.OrderBy("SupplierID");
===
private object bindingSourceTbl1_DataSourceBinding(object sender, EventArgs e,Expression whereClause)
{
using (SampleDbEntities dbo = new SampleDbEntities())
{
var q = from x in dbo.Tbl1
where x.Id == (int)comboBoxPerson.SelectedValue && whereClause
select x);
q = q.Where(whereClause)// your must reference dynamic linq library.
//whereClause is expression
.Take(100);
return q.ToList();
}
}
答案 2 :(得分:0)
我建议使用Joseph Albahari的PredicateBuilder。您可以在http://www.albahari.com/nutshell/predicatebuilder.aspx找到它。