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

时间:2015-02-12 15:04:14

标签: c# linq

这是我的代码:

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;。

1 个答案:

答案 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")}"