创建一个“where in” HQL查询

3

我在编写使用“where in”子句的HQL查询时遇到了麻烦。

简化后的类如下:

class Parent
{
    public virtual Int64 Id { get; private set; }
    public virtual string Name { get; private set; }
}

class Child
{
    public virtual Int64 Id { get; private set; }
    public virtual string Name { get; private set; }
    public virtual Parent Parent { get; private set; }
}

使用以下定义的映射:

class ParentMap : ClassMap<Parent>
{
    Id(x => x.Id);
    Map(x => x.Name);
}

class ChildMap : ClassMap<Child>
{
    Id(x => x.Id);
    Map(x => x.Name);
    References(x => x.Parent);
}

我想获取属于特定Parent项目的Child实例,因此我编写了以下代码:

// get children for several parents (a flattened list)
IEnumerable<Parent> parents = GetParents();

// use hql
IQuery q = Session.CreateQuery("from Child as c where c.Parent in (:parents)");
q.SetParameter("parents", parents);

但问题是,在q.SetParameter处我遇到了以下异常:
测试方法Can_get_children_for_many_parents引发异常:
  NHibernate.PropertyAccessException:
  Some.Namespace.Parent.Id的getter发生异常 
  ---> System.Reflection.TargetException:对象不符合目标类型。
[编辑]

我尝试使用q.SetParameter("parents", parents.Select(p => p.Id));,但我还是得到了相同的异常。

1个回答

6

尝试使用以下内容:

q.SetParameterList("parents", parents.ToList());

+1,谢谢,我刚在这个帖子中找到了它。在我的情况下,parents的类型是IEnumerable<Parent> - vgru
+1 对于 SetParameterList,但为什么要使用 parents.Split 而不是 parents.ToArray() - Stefan Steinegger
@stefan:这是我使用的一部分代码。我猜结果是相同的(假设数据始终正确)。 - Iridio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接