1

我正在尝试使用动态 linq 查询进行文件过滤。基本上,我让用户在我阅读的 XML 文档中定义 WhereExpression 和 OrderByExpression 字符串,然后将其应用于要从各个方向获取的文件列表。我找到了一个图书馆

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

并决定使用它,但我似乎开始遇到一些问题。到目前为止,当我尝试将 where 表达式和 Orderby 传递给 IQueryable 列表时,例如

 **WhereQuery**="@SubType = 02" 
 **OrderByQuery**="FormID"

      var sortedRepos = Repos.Where(dir.WhereExpression).OrderBy(dir.OrderByExpression);

我收到以下错误消息。

System.Linq.Dynamic.ParseException 被捕获 Message=Operator '=' 与操作数类型 'String' 和 'Int32' 不兼容 Source=Dynamic Position=12 StackTrace: at System.Linq.Dynamic.ExpressionParser.CheckAndPromoteOperands(Type signatures, String opName , Expression& left, Expression& right, Int32 errorPos) 在 System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd() 在 System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd() 在 System.Linq.Dynamic.ExpressionParser.ParseLogicalOr() 在 System.Linq .Dynamic.ExpressionParser.ParseExpression() 在 System.Linq.Dynamic.ExpressionParser.Parse(Type resultType) 在 System.Linq.Dynamic.DynamicExpression.ParseLambda(ParameterExpression[] 参数,类型 resultType,字符串表达式,Object[] 值)

现在当我像这样使用比较运算符时,

 **WhereQuery="@SubType == 02" 
 OrderByQuery="FormID"**

我也收到以下错误

System.Linq.Dynamic.ParseException was caught
  Message=Operator '==' incompatible with operand types 'String' and 'Int32'
  Source=Dynamic
  Position=12
  StackTrace:
       at System.Linq.Dynamic.ExpressionParser.CheckAndPromoteOperands(Type signatures, String opName, Expression& left, Expression& right, Int32 errorPos)
       at System.Linq.Dynamic.ExpressionParser.ParseComparison()
       at System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd()
       at System.Linq.Dynamic.ExpressionParser.ParseLogicalOr()
       at System.Linq.Dynamic.ExpressionParser.ParseExpression()
       at System.Linq.Dynamic.ExpressionParser.Parse(Type resultType)
       at System.Linq.Dynamic.DynamicExpression.ParseLambda(ParameterExpression[] parameters, Type resultType, String expression, Object[] values)
       at System.Linq.Dynamic.DynamicExpression.ParseLambda(Type itType, Type resultType, String expression, Object[] values)
       at System.Linq.Dynamic.DynamicQueryable.Where(IQueryable source, String predicate, Object[] values)
       at System.Linq.Dynamic.DynamicQueryable.Where[T](IQueryable`1 source, String predicate, Object[] values)

如何正确指定我的表达式以便过滤我的列表?提前致谢

4

3 回答 3

4

您必须使用==而不是=. 前者用于比较,后者用于赋值。

于 2013-06-21T23:31:08.073 回答
1

Where方法的签名是

public static IQueryable<T> Where<T>(this IQueryable<T> source, 
                                     string predicate,
                                     params object[] values)

因此,您可以使用所需类型的参数...

Where("SubType = @0", "02")

...或者...

Where("SubType = @0", 2)

...如果SubType是数字类型。

@0只是意味着:用 . 中的第一个参数替换它params

@前面SubType不是必须的。)

于 2013-06-22T20:37:47.987 回答
1

当您遇到此错误时:

  Message=Operator '==' incompatible with operand types 'String' and 'Int32'

这意味着它所说的。要更正这一点,请将值放在引号中。IE

WhereQuery**="@SubType = "/"02/"" 

这应该对你有用..

于 2017-02-08T21:48:56.707 回答