c# - 在 Linq 表达式主体中如何使用变量的值而不是对它的引用?

标签 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 => (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/

相关文章:

linq - 执行 Linq to Sitecore 查询时获取 Stack Overflow

c# - 为什么不能在编译时检查向下转换?

C# 强制表单焦点

c# - 需要在不知道对象是什么类型的情况下转换为对象

c# - 使用 LINQ 将字符串转换为 int 以进行排序

c# - 如何将一个静态列表的项目转移到另一个

linq - LINQ 查询的差异

c# - 相对路径改变?

c# - ffmpeg c# asp.net help on ProcessStartInfo

c# - 对绑定(bind)到 Linq 查询的 GridView 进行排序