如何设置动态表达式的上下文

时间:2017-09-22 21:59:42

标签: c# linq

我正在尝试构建动态表达式,我在编译时不知道它的结构但我知道如何解析它

var x = Expression.Parameter(typeof(T), "x");    
var lambda = DynamicExpressionParser.ParseLambda(new[] { x }, typeof(bool), expression);

其中expression是运行时字符串,可以是例如

x.Id > 1

现在我想完成一项更复杂的任务

x => ListOfIds.Contains(x.Id)

我想将一个值绑定到ListOfIds,我不知道它在表达式中的可用性和位置,因为它是动态的,而且函数只接受一个参数(基本上我想要提供表达到Linq的方法)。

2 个答案:

答案 0 :(得分:1)

您使用的是System.Linq.Dynamic.Core吗?

您似乎正在寻找他们的Substitution Values功能,以便将对象提供为生成的lambda的常量表达式。

以下代码适合您:

var x = Expression.Parameter(typeof(T), "x");
var constantExpressions = new Dictionary<string, object>
{
    {"ListOfIds", ListOfIds}
};
var lambda = DynamicExpressionParser.ParseLambda(new[] { x }, typeof(bool), "ListOfIds.Contains(x.Id)", constantExpressions);

答案 1 :(得分:0)

您可以在Github https://github.com/PoweredSoft/DynamicLinq

中使用此功能

或Nuget https://www.nuget.org/packages/PoweredSoft.DynamicLinq/

此类库允许您执行

var ageGroup = new List<int>() { 28, 27, 50 };
Persons.AsQueryable().Query(t => t.In("Age", ageGroup));

如果您希望看到源代码处理它,您可以查看https://github.com/PoweredSoft/DynamicLinq/blob/master/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs#L234

希望这可以提供帮助