You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中NHibernate In子句查询多查询问题的解决方法

VB.NET 实现单条IN子句批量查询(NHibernate)

问题根源

你原代码中传入Restrictions.In的是User实体对象集合,NHibernate为了解析这些实体的关联值,会触发多条SELECT查询。要生成单条带IN子句的SQL,必须传入属性值的列表(这里是用户名字符串列表)。

修正后的ICriteria实现

' 第一步:提取去重后的用户名列表
Dim userNames As List(Of String) = listofUsers.Select(Function(u) u.UserName).Distinct().ToList()

' 空列表判断,避免生成无效的IN()子句导致数据库报错
If Not userNames.Any() Then
    Return New List(Of User)()
End If

' 创建Criteria并执行单条IN查询
Using session As ISession = getSession()
    Dim criteria As ICriteria = session.CreateCriteria(GetType(User))
    criteria.Add(Restrictions.In("UserName", userNames))
    Return criteria.List(Of User).ToList()
End Using

更简洁的QueryOver写法

如果你倾向于更直观的语法,推荐使用NHibernate的QueryOver:

Dim userNames As List(Of String) = listofUsers.Select(Function(u) u.UserName).Distinct().ToList()

If Not userNames.Any() Then
    Return New List(Of User)()
End If

Using session As ISession = getSession()
    Dim users = session.QueryOver(Of User)() _
        .Where(Function(u) u.UserName.IsIn(userNames)) _
        .List() _
        .ToList()
    Return users
End Using

关键说明

  • 确保传入Restrictions.In或IsIn的是属性的原始值列表(如字符串、数值),而非实体对象集合。
  • 增加空列表判断,避免生成WHERE USERNAME IN()这种不符合SQL规范的语句,防止数据库抛出语法错误。

内容的提问来源于stack exchange,提问作者JRajot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:30:07