我在数据集中传递表达式时遇到问题。我正在粘贴我的所有代码..请纠正我,如果我错了并建议是否有简短的方法..
代码是检查(年龄> 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()());
答案 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();
}
您必须将参数传递给您的代表。