数据集中的LINQ表达式

时间:2011-10-11 11:51:45

标签: c# linq dataset

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

代码是检查(年龄> 10)&&(gender =='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()());

1 个答案:

答案 0 :(得分:0)

不太清楚你的问题究竟是什么,但如果你只是想通过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();
    }

您必须将参数传递给您的代表。