如何在C#中为过滤器数据编写通用表达式树

AliOsat Mostafavi

嗨,我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C#中通过表达式树构建集合过滤器

如何在Azure数据流中编写过滤器表达式?

C#如何编写正则表达式过滤器

如何在AngularJS中为格式化程序/过滤器参数提供表达式/函数

如何在将条件表达式保存在dataframe列中的spark数据框中应用条件表达式过滤器

如何在C#中捕获表达式树

C#表达式访问者,如何否定构建过滤器

如何在字符串中定义过滤器或表达式?

如何在熊猫过滤器函数中反转正则表达式

如何在Java regluar表达式中添加常用单词过滤器的单词列表

如何在Angular表达式中处理过滤器

如何在 morphia 中为过滤器编写查询

如何在闪亮的应用程序过滤器/按钮中应用正则表达式?

如何将过滤器表达式存储为字符串?

在Spring Boot Admin中为KubernetesDiscoveryClient指定Spring表达式语言过滤器

包含中的动态查询过滤器表达式

过滤器中的AngularJS逻辑表达式?

过滤器表达式的计算结果不是布尔值C#

如何从过滤器功能显示数据/数组以查看表达式内部?

如何在jmx记录器LogConsole中使用过滤器表达式?

如何在Curator过滤器上使用贪婪的正则表达式?

Serilog:如何在配置文件中指定过滤器表达式

如何检查dynamoDB过滤器表达式中是否不存在属性

如何使用C ++解析过滤器表达式并检索JSON对象?

mongodb驱动程序c#-过滤器表达式中的反射

如何在C#中添加永远不会用于表达式树的参数?

如何在 C# 中编写自定义正则表达式

如何在logstash中为JSON格式的嵌套文件编写过滤器部分

如何在Rust中编写管道过滤器?