2015-08-28 3 views
2

Я использую LINQ с деревьями выражений и case Statement в моем Select. Я делаю это, потому что условие Where строится динамически и в моем результате мне нужно знать, какая часть места была истина.Выражение Linq в case case

Это прекрасно работает:

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) }); 

Но теперь, я хочу использовать выражение e1 в моем случае заявление.

Что-то вроде этого:

var query = myTbl.Where(whereCondition) 
      .Select(s => new { mytbl = s, mycase = (e1 == true ? 1 : 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) });