sql - NHibernate IN 表达式/限制达到 2100 参数限制 SQL Server
问题描述
有没有办法强制 NHibernate 运行查询而不将其作为参数化查询执行。基本上我遇到了一个问题,我达到了 SQL Server 的 2100 参数限制。
由于我的查询有“IN”限制,我达到了限制。由于某些原因,我不会详细说明我需要在查询中使用 NHibernate In Restriction。
Query.Add(Restrictions.In("df.ID", myList));
我在查询上运行了 NHibernate 分析器,并且 NHibernate 将每个“In”值作为参数而不是文字值传递。
myList 是一个包含超过 5201 个值的数组。我在网上进行了研究,对于可以传递给 SQL 的 IN 值的数量没有限制,所以如果我可以让 NHibernate 将值作为文字值而不是应该解决我的问题的参数传递。
任何帮助,将不胜感激。另外请不要评论我对 IN 语句的使用,我遇到了一个问题,我的查询要求我以这种方式使用 IN 语句,而我无法以任何其他方式处理它。
解决方案
如果您对文字值没问题,则可以使用以下类:
/// <summary>
/// IN expression with inlined parameters like "Id IN (1, 2, 3)"
/// </summary>
public class InlineInExpression : SimpleExpression
{
//Note!!! this works properly only for numeric types. String list requires escaping and wrapping each value in `[escapedValue]`
public static InlineInExpression For<T>(string propertyPath, IEnumerable<T> list)
{
return new InlineInExpression(propertyPath, string.Join(", ", list));
}
/// <summary>
/// IN expression ctor
/// </summary>
/// <param name="propertyPath">Property path</param>
/// <param name="inExpression">Coma-delimited parameters like "1, 2, 3"</param>
private InlineInExpression(string propertyPath, string inExpression)
:base(propertyPath, null, inExpression)
{
}
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
SqlString[] columnNames =
CriterionUtil.GetColumnNamesForSimpleExpression(PropertyName, null, criteriaQuery, criteria, this, Value);
if (columnNames.Length != 1)
throw new HibernateException("This expression supports only single column properties.");
return new SqlString(columnNames[0], " IN (", Op, ")");
}
}
以及使用示例:
Query.Add(InlineInExpression.For("df.ID", myList));
请注意,它仅适用于数值(int、long 等)。如果需要字符串处理 - 您应该自己实现它。
您还可以将此方法应用于您的解决方案,以避免SQLCriterion
与表别名和列名一起使用。
推荐阅读
- json - 在 POST 请求中使用 GitLab CI 中的变量
- algorithm - 如何获得至少有 K 个不同数字的子数组的数量?
- c++ - 使用现代解决方案和可移植的 C++ 暂停控制台
- katalon-recorder - Katalon 记录器尝试多个选择器
- azure - Azure 应用程序网关入口控制器:尽管后端运行良好,但无法连接主机名
- shopify - Shopify - 为每个客户定制价格,使用外部 api 计算
- java - Spring Boot Common JPA 存储库类
- javascript - 自定义钩子的状态不会在所有组件中更新?
- microprofile - 如何将 Microprofile 健康检查绑定到应用程序的上下文根?
- git - Blender 的外部 fbx 文件未添加到 Unreal 项目的 git 存储库中