在Linq Expression体中如何使用变量的值而不是对它的引用?

这是我的代码:

IQueryable data = dc.TradeCard.Include("Address").Include("Vehicle"); string orderNumber = "ORD_NR_2"; Expression<Func> whereClause = a => a.orderNumber == orderNumber; // Expression<Func> whereClause = a => a.orderNumber == "ORD_NR_2"; List dataAsList = data.Where(whereClause).ToList(); 

如果我使用注释行,那么whereClause的值将如下所示:

{a =>(a.orderNumber ==“ORD_NR_2”)}

如果我使用另一个定义代替注释行,那么whereClause的值将如下所示:

{a =>(a.orderNumber == value(app_Employee.UI.UserFunctions.LejelentettTetelek + c__DisplayClass0).orderNumber)}

这是一个问题,因为我想保存whereClause并在orderNumber变量不存在的其他地方使用它。 那么如何在Linq表达式中使用orderNumber变量的值而不是对它的引用。 我想将“ value(app_Employee.UI.UserFunctions.LejelentettTetelek + c__DisplayClass0).orderNumber ”变成“ ORD_NR_2 ”。

此博客文章中的代码提供了一种方法,可以将表达式的所有部分评估为值,在所有可以完成的位置。

首先,它从底部向上遍历表达式树,指示哪些对象没有任何子对象的参数对象。 然后它从上到下遍历树,将所有表达式计算为一个没有参数的值。

我们还可以创建一个专门用于表示带有一个参数的Func的表达式的附加方法,这样在调用它时就不需要进行强制转换:

 public static Expression> Simplify( this Expression> expression) { return (Expression>)Evaluator.PartialEval(expression); } 

这允许你写:

 string orderNumber = "ORD_NR_2"; Expression> whereClause = a => a.orderNumber == orderNumber; string foo = whereClause.Simplify().ToString(); //foo will be "{a => (a.orderNumber == "ORD_NR_2")}"