gpt4 book ai didi

c# - 解析传递给 LINQ 表达式所在方法的 LINQ 参数

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:42 24 4
gpt4 key购买 nike

我正在研究 LINQ to SQL 转换器。它应该将 LINQ 查询转换为 SQL。我专注于创建查询的 WHERE 部分。我正在遍历 LINQ 表达式树,然后我遇到了一个问题,我无法获得传递给包含 LINQ 调用的方法的实际参数的值。

注意:我没有使用 LINQ to SQL,也没有使用 Entity Framework,也没有使用 NHibernate,因为我根本不能,因为游戏中有 VB6 Legacy 系统。

所以我想要实现的是在高层的某个地方调用这个:

int? parameterForCall = cmb.SelectedValue;

然后我有一个这样的方法,它在 ExpenseDAL 中调用 BaseDAL<Expense>.GetAll(X) 的类:

public IList<Expense> GetAll(int? parameterForCall)
{
IList<Expense> expenses = BaseDAL<Expense>.GetAll(t => t.Fixed ==
parameterForCall);
}

GetAll方法有这样的签名:

public static IList<T> GetAll(Expression<Func<T, bool>> predicate = null);

那我调用GetCondition将表达式转换为 SQL 的方法:

private static string GetCondition(Expression predicate = null);

这是一个递归函数。在其中,我遇到了需要获取传递给 GetAll 的参数的情况。表达式,命名为 parameterForCall .

问题是我可以这样写:

dynamic value = (predicate as ConstantExpression);

并且在 ImmediateWindow 中我可以看到 value.Value 是这样写的:

{FMC.Proxy.Common.BaseDAL.}
parameterForCall: 19

但我无法得到值 19。我想要它,所以我可以将它转换为值以放入 SQL 字符串。

有谁知道如何获得值 19 以便我可以在代码中使用它?

最佳答案

我的回答假设——你的问题支持这个假设——传递给 GetCondition 的谓词是 ConstantExpression 类型。

获取该值并非易事,因为 parameterForCall 是在自动生成的类中捕获的。当您查看 (predicate as ConstantExpression).Value.GetType() 的输出时,您可以看到这一点。就我而言,这输出:

UserQuery+<>c__DisplayClass0

这个类又有一个名为 parameterForCall 的公共(public)字段。现在,您有两种获得该值的可能性:

  1. 您知道该字段的名称,因为您控制着创建此表达式的方法。在这种情况下,您可以使用此代码获取值:

    var constantExpression = (ConstantExpression)predicate;
    dynamic autoGeneratedClass = constantExpression.Value;
    object value = autoGeneratedClass.parameterForCall;

    value.GetType() 将返回 System.Int32 并且 value 将是一个值为 19 的装箱 int。

  2. 您不知道该字段的名称。那样的话,就更难了。您可以使用反射来获取唯一公共(public)可见字段的值,但如果这样做,您将对自动生成的类做出很多假设。

关于c# - 解析传递给 LINQ 表达式所在方法的 LINQ 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com