Case 语句中的 Linq 表达式
Linq Expression in Case Statement
我在 Select 中使用带有表达式树和 case 语句的 LINQ。我这样做是因为 Where 条件是动态构建的,在我的结果中,我需要知道 where 的哪一部分是真的。
这很好用:
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) });
但是现在,我想在我的 case 语句中使用表达式 e1。
像这样:
var query = myTbl.Where(whereCondition)
.Select(s => new { mytbl = s, mycase = (e1 == true ? 1 : 0) });
知道怎么做吗?
如果您查询数据库,您可以先提交查询,然后应用已编译的 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) });
如果您想在另一个表达式中使用 lambda 表达式,那么这里是 link 我对另一个问题的回答,您可以在其中执行此操作。
我在 Select 中使用带有表达式树和 case 语句的 LINQ。我这样做是因为 Where 条件是动态构建的,在我的结果中,我需要知道 where 的哪一部分是真的。
这很好用:
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) });
但是现在,我想在我的 case 语句中使用表达式 e1。
像这样:
var query = myTbl.Where(whereCondition)
.Select(s => new { mytbl = s, mycase = (e1 == true ? 1 : 0) });
知道怎么做吗?
如果您查询数据库,您可以先提交查询,然后应用已编译的 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) });
如果您想在另一个表达式中使用 lambda 表达式,那么这里是 link 我对另一个问题的回答,您可以在其中执行此操作。