动态LINQ查询ExpandoObject?
有没有办法使用LINQ动态查询库(System.Linq.Dynamic)根据ExpandoObject的属性评估条件? 以下代码在“ var e...
”行引发exception,说“ExpandoObject类型中不存在属性或字段’权重”: –
const string TestCondition = "MyStateBag.Foo >= 50 && MyStateBag.Bar >= 100"; dynamic myStateBag = new ExpandoObject(); myStateBag.Foo = 70; myStateBag.Bar = 100; var p = Expression.Parameter(typeof(ExpandoObject), "MyStateBag"); var e = DynamicExpression.ParseLambda(new[] { p }, null, TestCondition); var result = e.Compile().DynamicInvoke(myStateBag); Assert.IsTrue(result);
替代方案是将“statebag”实现为字典,但这将导致稍微更详细的条件字符串,例如MyStateBag["Foo"] >= 50 && MyStateBag["Bar"] >= 100
。 由于这将用作用户脚本环境的基础,如果可以实现,我更喜欢更简单的ExpandoObject语法。
不是直接的。 动态LINQ库归结为表达式树,表达式树不直接支持动态。 最有可能的是,动态查询库使用Expression.PropertyOrField
来处理.Foo
等,这对dynamic
不起作用 。
您可以编写一个自定义表达式解析器,如果它发现参数是字典,则用大量的查找代码替换它; 但是并不好玩。