Provider.CreateQuery 上的 Linq 异常
Linq exception on Provider.CreateQuery
鉴于此 class:
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
引发 "Argument expression is not valid" 异常我做错了什么?
与DynamicExpression.Parse
的区别(因此是问题的原因)是DynamicExpressionParser.ParseLambda
方法returns LambdaExpression(基本上是Expression<Func<TResult>>
)不是有效的查询表达式。
但它的 Body 是,所以最简单的解决方法是使用
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2.Body);
或者你可以直接使用 System.Linq.Dynamic.Core.Parser.ExpressionParser
class:
var expression2 = new ExpressionParser(null, query, new[] { externals }, null)
.Parse(typeof(IQueryable<SomeClass>));
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2);
鉴于此 class:
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
引发 "Argument expression is not valid" 异常我做错了什么?
与DynamicExpression.Parse
的区别(因此是问题的原因)是DynamicExpressionParser.ParseLambda
方法returns LambdaExpression(基本上是Expression<Func<TResult>>
)不是有效的查询表达式。
但它的 Body 是,所以最简单的解决方法是使用
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2.Body);
或者你可以直接使用 System.Linq.Dynamic.Core.Parser.ExpressionParser
class:
var expression2 = new ExpressionParser(null, query, new[] { externals }, null)
.Parse(typeof(IQueryable<SomeClass>));
var result2 = queryableData.Provider.CreateQuery<SomeClass>(expression2);