解析一个linq表达式[英] Parsing a linq expression

问题描述

假设我们有以下内容:

public 列表<T>查询<T>(谓词<T>where){//在这里查询返回列表;}

我们这样称呼上面的:
var return = Query(row => row.SerialNumber>200 && row.Code < 1000);

我们如何获取表达式详细信息以便查询我们的自定义数据源?
例如 ->[字段名:序列号,运算符:大于,值:200] AND [字段名:代码,运算符:小于,值:1000]
解决方案
怎么样:

静态 只读列表<int>data = new 列表<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };静态 IEnumerableSelectData(谓词选择器){return from d in 数据 where 选择器(d) 选择 d;}static void Main(string[] args){Console.WriteLine("data = {0}", string.Join(",", SelectData(d => d>4)));}


在这个例子中,它是 int 类型,但它可以是你喜欢的任何类型.在谓词委托中,您可以访问 SaleInvoiceRow 实例的任何成员.

干杯

Andi

第一个解决方案不是所要求的.第二次尝试:;-)

请参阅 http://msdn.microsoft.com/en-us/library/bb397951.aspx[^] 作为起点.

静态 只读列表<int>data = new 列表<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };静态 IEnumerableSelectData(表达式<谓词<int>>选择器){ParameterExpression param = (ParameterExpression)selector.Parameters[0];BinaryExpression 操作 = (BinaryExpression)selector.Body;ParameterExpression left = (ParameterExpression)operation.Left;ConstantExpression right = (ConstantExpression) operation.Right;Console.WriteLine("分解表达式:{0} => {1} {2} {3}",param.Name, left.Name, operation.NodeType, right.Value);//...return from d in 数据 where selector.Compile()(d) select d;}static void Main(string[] args){Console.WriteLine("data = {0}", string.Join(",", SelectData(d=>d>4)));}


结果输出为:

Decomposed expression: d => d GreaterThan 4
data = 5,6,7,8,9


您必须使表达式的解析更加复杂.在上面的例子中,假设只有一个二元运算作为 lambda 表达式的主体.

干杯

安迪

本文地址:https://www.itbaoku.cn/post/1395023.html