这是我的代码:
IQueryable<DAL.TradeCard> data = dc.TradeCard.Include("Address").Include("Vehicle");
string orderNumber = "ORD_NR_2";
Expression<Func<DAL.TradeCard, bool>> whereClause = a => a.orderNumber == orderNumber;
// Expression<Func<DAL.TradeCard, bool>> whereClause = a => a.orderNumber == "ORD_NR_2";
List<DAL.TradeCard> dataAsList = data.Where(whereClause).ToList();
如果我使用注释行,那么whereClause的值将如下所示:
{a =&gt; (a.orderNumber ==&#34; ORD_NR_2&#34;)}
如果我使用另一个定义代替注释行,那么whereClause的值将如下所示:
{a =&gt; (a.orderNumber == 值(app_Employee.UI.UserFunctions.LejelentettTetelek + LT;&GT; c__DisplayClass0).orderNumber)}
这是一个问题,因为我想保存whereClause并在orderNumber变量不存在的其他地方使用它。 那么如何使用orderNumber变量的值而不是Linq表达式中对它的引用。我想制作&#34; 值(app_Employee.UI.UserFunctions.LejelentettTetelek +&lt;&gt; c__DisplayClass0)。订单号&#34;进入&#34; ORD_NR_2 &#34;。
答案 0 :(得分:3)
this blog post中的代码提供了一种方法,可以将表达式的所有部分评估为值,在所有可以完成的地方。
首先,它从底部向上遍历表达式树,指示哪些对象没有任何子对象参数对象。然后它从上到下遍历树,将所有表达式计算为一个没有参数的值。
我们还可以专门为表达Func
的表达式创建一个附加方法,该表达式包含一个参数,这样您在调用它时就不需要进行强制转换:
public static Expression<Func<TIn, TOut>> Simplify<TIn, TOut>(
this Expression<Func<TIn, TOut>> expression)
{
return (Expression<Func<TIn, TOut>>)Evaluator.PartialEval(expression);
}
这允许你写:
string orderNumber = "ORD_NR_2";
Expression<Func<DAL.TradeCard, bool>> whereClause = a => a.orderNumber == orderNumber;
string foo = whereClause.Simplify().ToString();
//foo will be "{a => (a.orderNumber == "ORD_NR_2")}"