动态Linq查询使用

时间:2013-06-21 23:29:02

标签: c# linq

我正在尝试使用Dynamic 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列表e.ge

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

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

我收到以下错误消息。

  

发现了System.Linq.Dynamic.ParseException     Message = Operator'='与操作数类型'String'和'Int32'不兼容     来源=动态     位置= 12     堆栈跟踪:          在System.Linq.Dynamic.ExpressionParser.CheckAndPromoteOperands(类型签名,字符串opName,表达式和左,表达式&右,Int32 errorPos)          在System.Linq.Dynamic.ExpressionParser.ParseComparison()          在System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd()          在System.Linq.Dynamic.ExpressionParser.ParseLogicalOr()          在System.Linq.Dynamic.ExpressionParser.ParseExpression()          在System.Linq.Dynamic.ExpressionParser.Parse(类型resultType)          在System.Linq.Dynamic.DynamicExpression.ParseLambda(ParameterExpression []参数,类型resultType,String表达式,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)

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

3 个答案:

答案 0 :(得分:4)

您必须使用==代替=。前者用于比较,后者用于分配。

答案 1 :(得分: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不是必需的。)

答案 2 :(得分:1)

如果出现此错误:

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

这意味着它所说的。 要纠正,请将值放在报价中。即

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

这应该适合你..

相关问题