1

给定这个类:

class SomeClass
{
    public int SomeValue { get; set; }
}

以下列表:

var queryableData = new List<SomeClass>() {
    new SomeClass{SomeValue=1 },
    new SomeClass{SomeValue=2 },
    new SomeClass{SomeValue=3 },
    new SomeClass{SomeValue=4 },
    new SomeClass{SomeValue=5 },
    new SomeClass{SomeValue=6 },
    new SomeClass{SomeValue=7 },
}.AsQueryable();

我尝试动态查询列表的这段代码(请注意,字符串query可以包含任何内容,例如Take, Select,OrderBy等)。

var externals = new Dictionary<string, object>();
externals.Add("SomeClass", queryableData);

string query = "SomeClass.Where(o => o.SomeValue >= 3)"; // or any query

// here i use the code from System.Linq.Dynamic
var expression = DynamicExpression.Parse(typeof(IQueryable<SomeClass>), query, new[] { externals });
// result will have five values
var result = queryableData.Provider.CreateQuery<SomeClass>(expression);

// here i use the code from System.Linq.Dynamic.Core
var expression2 = DynamicExpressionParser.ParseLambda(typeof(IQueryable<SomeClass>), query, new[] { externals });
// will throw exception here: Argument expression is not valid
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2).ToDynamicArray();

我想知道我做错了什么,Provider.CreateQuery导致“参数表达式无效”异常?

4

1 回答 1

2

DynamicExpression.Parse(因此问题的原因)的区别在于该DynamicExpressionParser.ParseLambda方法返回LambdaExpression(基本上Expression<Func<TResult>>),它不是有效的查询表达式。

但它的主体是,所以最简单的解决方法是使用

var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2.Body);

或者,您可以System.Linq.Dynamic.Core.Parser.ExpressionParser直接使用类:

var expression2 = new ExpressionParser(null, query, new[] { externals }, null)
    .Parse(typeof(IQueryable<SomeClass>));
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2);
于 2019-02-11T18:28:17.910 回答