案例陈述中的Linq表达

时间:2015-08-28 09:47:03

标签: c# linq case expression-trees

我在选择中使用带有表达式树的LINQ和一个case语句。我之所以这样做是因为Where Condition是动态构建的,而且在我的Result中,我需要知道哪个部分是真的。

这很好用:

ParameterExpression peTbl = Expression.Parameter(typeof(MyTbl), "mytbl");

Expression left = Expression.Property(peTbl, "Col1");
Expression right = Expression.Constant((ulong)3344, typeof(ulong));
Expression e1 = Expression.Equal(left, right);

left = Expression.Property(peTbl, "Col2");
right = Expression.Constant((ulong)27, typeof(ulong));
Expression e2 = Expression.Equal(left, right);

Expression predicateBody = Expression.Or(e1, e2);

Expression<Func<MyTbl, bool>> whereCondition = Expression.Lambda<Func<MyTbl, bool>>(predicateBody, new ParameterExpression[] { peTbl });

var query = myTbl.Where(whereCondition)
            .Select(s => new { mytbl = s, mycase = (s.Col1 == 3344 ? 1 : 0) });

但是现在,我想在我的案例声明中使用Expression e1。

这样的事情:

var query = myTbl.Where(whereCondition)
            .Select(s => new { mytbl = s, mycase = (e1 == true ? 1 : 0) });

知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

如果您对数据库进行查询,则可以先提交查询,然后应用已编译的e1

  var e1Compiled = Expression.Lambda<Func<MyTbl,bool>>(e1, peTbl).Compile();
  var query = myTbl
                .Where(whereCondition).ToList()
                .Select(s => new { mytbl = s, mycase = (e1Compiled(s) ? 1 : 0) });

如果没有数据库,只需使用已编译的e1

  var query = myTbl
                .Where(whereCondition)
                .Select(s => new { mytbl = s, mycase = (e1Compiled(s) ? 1 : 0) });

答案 1 :(得分:0)

如果你想在另一个中使用lambda表达式,那么这是一个链接,我给另一个问题的答案,你可以在那里做。 Pass expression parameter as argument to another expression