Nhibernate Linq In Clause

时间:2010-03-30 16:34:53

标签: linq nhibernate linq-to-nhibernate

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

3 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:3)

同意,这确实有效。我发现生成的'not in'的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)],
...

当'not in'更清楚时(这不是我计划读取每一行,但可能在跟踪/配置文件中),这似乎对'case'有点奇怪。

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

我意识到上述'奇怪'的SQL选择只有在我使用

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

如果我用过

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

生成的SQL更清晰(使用'not in')

答案 2 :(得分:0)

NHibernate有一个选项IsIn RestrictionExtensions

  

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