这是我的代码:
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 => (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”。
最佳答案
this blog post中的代码(链接已失效,存档版本:https://web.archive.org/web/20160122054419/http://blogs.msdn.com/b/mattwar/archive/2007/08/01/linq-building-an-iqueryable-provider-part-iii.aspx) 提供了一种方法,可以在所有可以完成的地方将表达式的所有部分计算为值。
首先,它从下往上遍历表达式树,指出哪些对象没有参数对象作为它们的子对象。然后它从上到下遍历树,将所有表达式计算为其中没有参数的值。
我们还可以创建一个额外的方法,专门用于表示一个带有一个参数的 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")}"
关于c# - 在 Linq 表达式主体中如何使用变量的值而不是对它的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28480843/