我正在尝试构建动态表达式,我在编译时不知道它的结构但我知道如何解析它
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的方法)。
答案 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。
希望这可以提供帮助