nhibernate - 无法将集合与 InExpression 一起使用

标签 nhibernate

我刚刚深入研究了一些 NHibernate,但我在必须编写的一个更“复杂”(对我来说!)的查询中遇到了麻烦。场景是:

我有一个“员工”对象,其中附加了“技能”集合。我想传递一个“技能”列表来查询(例如,如果我只想要可以“ cooking ”或“编码”或两者兼而有之的人)并返回匹配员工的列表,但我有有点麻烦......

我所得到的对象方面是:

public class StaffMember : Resource
{
    public virtual string EmployeeId { get; set; }      

    public virtual bool IsTeamLeader { get; set; }

    public virtual StaffMember TeamLeader { get; set; }

    public virtual IList<Skill> Skills { get; set; }
}

public class Skill : BaseDomainObject
{
    public virtual string Name { get; set; }
}

我猜 SQL 会是这样的:

select distinct st.*
from staff st, resource re
inner join staffskills sks on re.id = sks.staffresourceid
inner join skill ski on ski.id = sks.skillid
where st.resourceid = re.id
and ski.id in (1,2,3,4)

我尝试在条件中使用“Expression.InG("Skills", SkillsSearchList)”,但是当两个集契约(Contract)时使用时不能使用它(例如,如果他们只有一项技能,那就没问题了! )...有什么指示吗?

最佳答案

你需要

.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))

我不确定这是否可以通过技能对象列表来完成。无论哪种方式,sql 的最终结果都与上面相同。

请注意,这将创建一个笛卡尔积,因此您可能需要使用存在子查询或 .SetResultTransformer(new DistinctRootEntityResultTransformer()) 来获取不同员工的列表。

关于nhibernate - 无法将集合与 InExpression 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283989/

相关文章:

nhibernate - 命名查询未知

c# - NHibernate 中不区分大小写的排序顺序

c# - Select N+1的NHibernate QueryOver解决方案

NHibernate - 如何迭代附加到 session 的持久实体?

sql-server - 在线索引重建期间INSERT超时

c# - 仅通过主键删除 NHibernate 中的实体

NHibernate HQL 日期函数

.net - 提高 nHibernate 数据访问层的性能

c# - 在 nhibernate 中执行自定义查询并映射到自定义域对象

asp.net-mvc - 有人可以帮助我理解为什么使用 NHibernate 时自动标识 (int) 不好?