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()());
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.
精彩评论