Nhibernate Expression.In限制

时间:2012-10-25 09:48:33

标签: tsql nhibernate nhibernate-criteria

我正在查询Nhibernate条件查询,其中包含超过2100个In子句值。 我做类似Session.CreateCriteria(typeof())的东西。添加(Expression.In(“fieldName”,arrayValue)) 其中arrayValue包含超过2100个值。我面临错误 发生例外: 未知错误 NHibernate.ADOException:无法执行查询..然后在数组中包含超过3000个值的查询。 通过一些谷歌帮助,我们发现Sql中的IN子句仅支持2100个值。 有没有人早些时候遇到类似的问题?我们不希望更改查询,因为它是以某种通用方式编写的,而不是自定义的。

2 个答案:

答案 0 :(得分:2)

这是SQL Server的限制。我不建议这样做,但如果你坚持,你可以通过创建一个表值sql函数(参见http://www.dzone.com/snippets/function-getting-comma)来解决它,该函数用逗号(或你想要的任何分隔符)分割字符串并返回将值作为表格传递,然后将所有ID传递为(例如)1参数中的逗号分隔列表,并在条件查询中使用SQLCriterion。

例如:

  criteria.Add(
      new SQLCriterion("{alias}.ID IN (SELECT element FROM dbo.GetCSVValues(?))", 
          new[]{csvListOfIds}, 
          new[]{NHibernateUtil.String}))

答案 1 :(得分:2)

您可以将数组拆分为多个批次,多次查询,然后合并结果。