数据集中的 LINQ 表达式

发布于 2024-12-09 18:25:30 字数 1990 浏览 0 评论 0原文

我在条件数据集中传递表达式时遇到问题..我正在粘贴我的所有代码..如果我错了,请纠正我,并建议是否有简短的方法..

代码是检查(年龄> 10)&& (性别=='M'),我需要在数据集中应用此规则。

  Expression<Func<int, bool>> ageexpr; // = creteriaattributeIDtest => creteriaattributeIDtest < Convert.ToInt32(rightval1);

         ParameterExpression numparam = Expression.Parameter(typeof(int), "age");
         ConstantExpression criteriaValue1 = Expression.Constant(Convert.ToInt32(rightval1), typeof(int));
         BinaryExpression comparison1 = Expression.LessThan(numparam, criteriaValue1);

         ageexpr = Expression.Lambda<Func<int, bool>>(
                 comparison1,
                new ParameterExpression[] { numparam });

         Func<int, bool> resultage = ageexpr.Compile();

         // Invoking the delegate and writing the result to the console.

         bool firstrule = resultage(14);

         Console.WriteLine("1st Rule" + firstrule);

        // DataView res1 = dt1.AsEnumerable().Where(resultage(Convert.ToInt32(rightval1))).AsDataView();


         Expression<Func<string, bool>> genexpr;

         ParameterExpression genparam = Expression.Parameter(typeof(string), "gender");
         ConstantExpression criteriaValue2 = Expression.Constant("M", typeof(string));
         BinaryExpression comparison2 = Expression.Equal(genparam, criteriaValue2);

         genexpr = Expression.Lambda<Func<string, bool>>(
                 comparison2,
                new ParameterExpression[] { genparam });

         Func<string, bool> resultgen = genexpr.Compile();

         bool secondrule = resultgen("M");

         // Invoking the delegate and writing the result to the console.
         Console.WriteLine("2nd Rule" + secondrule);


         Expression finexpr = Expression.AndAlso(Expression.Constant(firstrule), Expression.Constant(secondrule));
         Console.WriteLine(Expression.Lambda<Func<bool>>(finexpr).Compile()());

i am getting problems while passing expression in dataset where condition.. I am pasting all my codes .. please correct me if i am wrong and suggest if there are short methods..

code is to check (age>10)&&(gender=='M'), i need to apply this rule in dataset.

  Expression<Func<int, bool>> ageexpr; // = creteriaattributeIDtest => creteriaattributeIDtest < Convert.ToInt32(rightval1);

         ParameterExpression numparam = Expression.Parameter(typeof(int), "age");
         ConstantExpression criteriaValue1 = Expression.Constant(Convert.ToInt32(rightval1), typeof(int));
         BinaryExpression comparison1 = Expression.LessThan(numparam, criteriaValue1);

         ageexpr = Expression.Lambda<Func<int, bool>>(
                 comparison1,
                new ParameterExpression[] { numparam });

         Func<int, bool> resultage = ageexpr.Compile();

         // Invoking the delegate and writing the result to the console.

         bool firstrule = resultage(14);

         Console.WriteLine("1st Rule" + firstrule);

        // DataView res1 = dt1.AsEnumerable().Where(resultage(Convert.ToInt32(rightval1))).AsDataView();


         Expression<Func<string, bool>> genexpr;

         ParameterExpression genparam = Expression.Parameter(typeof(string), "gender");
         ConstantExpression criteriaValue2 = Expression.Constant("M", typeof(string));
         BinaryExpression comparison2 = Expression.Equal(genparam, criteriaValue2);

         genexpr = Expression.Lambda<Func<string, bool>>(
                 comparison2,
                new ParameterExpression[] { genparam });

         Func<string, bool> resultgen = genexpr.Compile();

         bool secondrule = resultgen("M");

         // Invoking the delegate and writing the result to the console.
         Console.WriteLine("2nd Rule" + secondrule);


         Expression finexpr = Expression.AndAlso(Expression.Constant(firstrule), Expression.Constant(secondrule));
         Console.WriteLine(Expression.Lambda<Func<bool>>(finexpr).Compile()());

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷爱 2024-12-16 18:25:30

不太清楚你的问题到底是什么,但如果你只想通过 LINQ 创建一个 DataView,为什么不使用这样的东西:

    static void Main(string[] args)
    {
        var minimunAge = 10;

        var t = new DataTable();
        t.Columns.Add("age", typeof(Int32));
        t.Columns.Add("gender", typeof(string));
        t.Columns.Add("name", typeof(string));

        t.Rows.Add(20, "M", "Steve");
        t.Rows.Add(5, "M", "John");
        t.Rows.Add(32, "F", "Mary");

        var view = t.AsEnumerable().Where(r => r.Field<Int32>("age") > minimunAge && r.Field<string>("gender") == "M").AsDataView();
    }

如果你真的想使用表达式,试试这个:

    static void Main(string[] args)
    {
        var t = new DataTable();
        t.Columns.Add("age", typeof(Int32));
        t.Columns.Add("gender", typeof(string));
        t.Columns.Add("name", typeof(string));

        t.Rows.Add(20, "M", "Steve");
        t.Rows.Add(5, "M", "John");
        t.Rows.Add(32, "F", "Mary");

        Expression<Func<int, bool>> ageexpr;

        ParameterExpression numparam = Expression.Parameter(typeof(int), "age");
        ConstantExpression criteriaValue1 = Expression.Constant(Convert.ToInt32(10), typeof(int));
        BinaryExpression comparison1 = Expression.GreaterThan(numparam, criteriaValue1);

        ageexpr = Expression.Lambda<Func<int, bool>>(
                comparison1,
               new ParameterExpression[] { numparam });

        Func<int, bool> resultage = ageexpr.Compile();

        // Invoking the delegate and writing the result to the console.

        bool firstrule = resultage(14);

        Console.WriteLine("1st Rule" + firstrule);

        DataView res1 = t.AsEnumerable().Where(r=> resultage(r.Field<Int32>("age"))).AsDataView();
    }

你必须将参数传递给你的委托。

Not quite clear what your problem actually is, but if you just want to create a DataView via LINQ, why not use something like this:

    static void Main(string[] args)
    {
        var minimunAge = 10;

        var t = new DataTable();
        t.Columns.Add("age", typeof(Int32));
        t.Columns.Add("gender", typeof(string));
        t.Columns.Add("name", typeof(string));

        t.Rows.Add(20, "M", "Steve");
        t.Rows.Add(5, "M", "John");
        t.Rows.Add(32, "F", "Mary");

        var view = t.AsEnumerable().Where(r => r.Field<Int32>("age") > minimunAge && r.Field<string>("gender") == "M").AsDataView();
    }

If you really want to use Expressions, try this:

    static void Main(string[] args)
    {
        var t = new DataTable();
        t.Columns.Add("age", typeof(Int32));
        t.Columns.Add("gender", typeof(string));
        t.Columns.Add("name", typeof(string));

        t.Rows.Add(20, "M", "Steve");
        t.Rows.Add(5, "M", "John");
        t.Rows.Add(32, "F", "Mary");

        Expression<Func<int, bool>> ageexpr;

        ParameterExpression numparam = Expression.Parameter(typeof(int), "age");
        ConstantExpression criteriaValue1 = Expression.Constant(Convert.ToInt32(10), typeof(int));
        BinaryExpression comparison1 = Expression.GreaterThan(numparam, criteriaValue1);

        ageexpr = Expression.Lambda<Func<int, bool>>(
                comparison1,
               new ParameterExpression[] { numparam });

        Func<int, bool> resultage = ageexpr.Compile();

        // Invoking the delegate and writing the result to the console.

        bool firstrule = resultage(14);

        Console.WriteLine("1st Rule" + firstrule);

        DataView res1 = t.AsEnumerable().Where(r=> resultage(r.Field<Int32>("age"))).AsDataView();
    }

You have to pass a parameter to your delegates.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文