如果我有产品.
var p = new Product { Price = 30 };
Run Code Online (Sandbox Code Playgroud)
我有以下linq查询.
var q = repo.Products().Where(x=>x.Price == p.Price).ToList()
Run Code Online (Sandbox Code Playgroud)
在IQueryable提供程序中,我得到一个包含常量表达式的p.Price的MemberExpression,但是我似乎无法从它获得值"30".
更新 我试过这个,但它似乎不起作用.
var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);
Run Code Online (Sandbox Code Playgroud)
干杯.
我正在使用表达式围绕Web服务调用构建API,以允许开发人员指定查询并让ExpressionVisitor将Expression转换为查询字符串.该请求是XML,其中包含一个包含查询字符串的特定元素.
例如,我可以做这样的事情,它将检索银行名称为Bank 1或Bank 2的所有支票账户:
"bankname ='Bank 1'或bankname ='Bank 2'"
Web服务可以处理更复杂的查询,但我现在只是坚持这一点.
所以我有一个CheckingAccount类:
[IntacctObject("checkingaccount")]
public class CheckingAccount : Entity
{
[IntacctElement("bankaccountid")]
public string Id { get; set; }
[IntacctElement("bankname")]
public string BankName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有一个ExpressionVisitor,其主要功能是转换如下表达式:
Expression> expression = ca => ca.BankName == "Bank 1" || ca.BankName == "Bank 2"
进入查询:"bankname ='Bank 1'或bankname ='Bank 2'"
这不是那么艰难.当我引入局部变量时,事情开始崩溃的地方:
var account = new CheckingAccount { BankName = "Bank 1" };
string bankName = "Bank 2";
Expression> expression = ca => ca.BankName == account.BankName …Run Code Online (Sandbox Code Playgroud)