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
相关产品推荐
相关产品推荐

