【问题标题】:System.Linq.Dynamic - Can I use IN clause in WHERE statementSystem.Linq.Dynamic - 我可以在 WHERE 语句中使用 IN 子句吗
【发布时间】:2012-04-28 12:34:51
【问题描述】:

我有动态 linq WHERE 语句:

dataContext.Table.Where("id = 0 Or id = 1 Or id = 2 Or ...");

我想改成:

dataContext.Table.Where("id IN (0, 1, 2, ...)");

但它不起作用。我怎样才能做到这一点以获得更好的性能?

【问题讨论】:

    标签: c# .net linq dynamic


    【解决方案1】:
    var ids = new int[] {1,2,3,4};
    dataContext.Table.Where(f => ids.Contains(f.id))
    

    【讨论】:

    • 谢谢,我知道这一点,但列名“id”正在改变。我得到了这个专栏。所以我不能使用静态 Linq。我必须对字符串使用动态 linq 库,其中以 clausule 为例。 Dynamic Linq
    • @Ingenu,阅读资源,你会发现 Dynamic Linq 是关于什么的
    【解决方案2】:

    来自How to use “contains” or “like” in a dynamic linq query?

    //edit: this is probably broken, see below
    ids = new int[] {1,2,3,4};
    dataContext.Table.Where("id.Contains(@0)", ids);
    

    旁白:在动态 linq 表达式中使用占位符是一种很好的做法。否则你可能会面临 linq 注入攻击 (Is Injection Possible through Dynamic LINQ?)


    编辑:

    其实我觉得我搞砸了。 不幸的是,我目前无法对此进行测试。 但我认为在这种情况下正确的语法应该是 dataContext.Table.Where("@0.Contains(id)",ids);,而不是相反,并且该版本不是开箱即用。

    请参阅here 了解将此功能添加到动态链接的方法。您需要为此修改库。

    【讨论】:

      【解决方案3】:

      似乎在 System.Linq.Dynamic 的 1.0.4 版本中,我们可以使用以下语法 dataContext.Table.Where("@0.Contains(<b>outerIt</b>.id)",ids);,因为它是在已经引用的博客中制作和呈现的: here

      【讨论】:

      • 似乎对于字符串值,ids 必须是 List,并且 not 是数组,否则会出现错误“No 'it' is in scope "
      猜你喜欢
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2012-06-28
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2010-12-07
      相关资源
      最近更新 更多