我在编写使用“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));
,但我还是得到了相同的异常。
parents
的类型是IEnumerable<Parent>
。 - vgruSetParameterList
,但为什么要使用parents.Split
而不是parents.ToArray()
? - Stefan Steinegger