【问题标题】:Nhibernate Linq In ClauseNhibernate Linq In 子句
【发布时间】:2010-03-30 16:34:53
【问题描述】:

是否可以让 Nhibernate linq 生成带有“In”子句的查询?例如- Where AnID in (x,y,z)?

【问题讨论】:

    标签: linq nhibernate linq-to-nhibernate


    【解决方案1】:

    我不知道 nHibernate 在生成所有潜在 LINQ 查询方面的状态,但您应该能够使用 .Contains() 生成 IN。

    var list = new int[] { x, y, x };
    var q = db.Entities.Where( e => list.Contains( e.AnID ) );
    

    【讨论】:

      【解决方案2】:

      同意,这确实有效。我发现为“不在”生成的 SQL 很奇怪(截至 3.3.0 GA)

      ...
      from
        mytable t0_
      where
        case
          when t0_.testValue in (
                    @p0 , @p1 , @p2
                ) then 1
                else 0
          end=@p3
      @p0 = 9 [Type: Int32 (0)],
      @p1 = 99 [Type: Int32 (0)],
      @p2 = 109 [Type: Int32 (0)],
      @p3 = False [Type: Boolean (0)],
      ...
      

      似乎有点奇怪,当“不在”时会更清楚(不是我打算阅读每一行,而是在跟踪/配置文件中)。

      (……那天晚些时候……)

      我意识到上述“奇怪”的 SQL 选择只有在我使用时才出现

      .Where(e => list.Contains(e.AnID) == false)
      

      如果我用过

      .Where(e => !list.Contains(e.AnID))
      

      生成的 SQL 更加简洁(使用 'not in')

      【讨论】:

        【解决方案3】:

        NHibernate 有一个选项 IsIn 部分的 RestrictionExtensions

        x => x.Name.IsIn(new[] {"a", "b"} )

        【讨论】:

          猜你喜欢
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-11
          • 2010-10-25
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          相关资源
          最近更新 更多