【问题标题】:Dynamic Linq query using使用动态 Linq 查询
【发布时间】:2013-06-21 23:29:02
【问题描述】:

我正在尝试使用动态 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' 不兼容 源=动态 位置=12 堆栈跟踪: 在 System.Linq.Dynamic.ExpressionParser.CheckAndPromoteOperands(类型签名,字符串 opName,Expression& 左,Expression& 右,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,字符串表达式,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)

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

    【讨论】:

    • 我只是更新了我的报告以显示我在尝试时得到的结果。我已经研究了一个多小时,并且已经阅读了文档,但我知道我在这里仍然遗漏了一些东西。
    • 将您的 int 变量解析为字符串并再次比较。添加.ToString() 应该可以。要么将您的 SubType 更改为整数,您的设计似乎不一致。
    • 我不明白你说我的设计不一致是什么意思。 SubType 属性本身就是一个字符串,我希望 02 也被视为一个字符串。或者我如何在传入的 WhereExpression 中指定 02 是 String 而不是 int 值?
    • 首先:尝试省略方程式中的空格。如果这不起作用,请将02 放在一个临时变量中(它只是测试数据,对吗?)并构建您的查询 `**WhereQuery**="@SubType==" + temp;`跨度>
    • 这似乎根本不起作用,因为我只是希望用户在 XML 文件中为 WhereExpression 值指定一个字符串。
    【解决方案2】:

    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 之前的@ 不是必须的。)

    【讨论】:

    • 我的查询与您显示的方式一样,但您的回答无效。还有其他线索吗?只是为了添加我的运行时查询,将空值与日期时间进行比较。
    • @Jha.prashant “没有工作”并没有告诉我太多,但也许通过修订与它有关?
    • 例如:其中 ("{0}=@0".FormatWith(key), values[key]) 和 key 是 dateandtime 类型的属性,其中包含 null 作为值。我删除了 @ 但是它对我不起作用。它仍然抛出错误。
    • @Jha.prashant 你最好把这个放在一个问题中。这需要更多细节。
    【解决方案3】:

    当您遇到此错误时:

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

    它的意思是它所说的。 要更正这一点,请将值放在引号中。即

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

    这应该对你有用..

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2012-12-21
      • 2011-07-05
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多