细节实体字段上的Nhibernate查询覆盖投影

细节实体字段上的Nhibernate查询覆盖投影,nhibernate,projection,queryover,Nhibernate,Projection,Queryover,我想做的是能够使用queryover的投影。我仅使用AliasToBean Transformer在第一级上使用投影成功地实现了这一点,但当我从详细信息类nhibenate对属性进行投影时,会引发以下异常: Could not find a setter for property 'FirstContact' in class 'Model.Personnel.Entities.Employee' at NHibernate.Properties.ChainedPropertyAccesso

我想做的是能够使用queryover的投影。我仅使用AliasToBean Transformer在第一级上使用投影成功地实现了这一点,但当我从详细信息类nhibenate对属性进行投影时,会引发以下异常:

 Could not find a setter for property 'FirstContact' in class 'Model.Personnel.Entities.Employee'
 at NHibernate.Properties.ChainedPropertyAccessor.GetSetter(Type theClass, String propertyName)
 at NHibernate.Transform.AliasToBeanResultTransformer.TransformTuple(Object[] tuple, String[] aliases)
 at NHibernate.Loader.Criteria.CriteriaLoader.GetResultList(IList results, IResultTransformer customResultTransformer)
 at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
 at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
 at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
 at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
 at NHibernate.Impl.CriteriaImpl.List(IList results)
 at NHibernate.Impl.CriteriaImpl.List[T]()
 at NHibernate.Criterion.QueryOver`1.List[U]()
 at NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List[U]()
 at Tests.Entities.EmployeeFacts.QueryEmployees()
在类“Model.personal.Entities.Employee”中找不到属性“FirstContact”的setter
在NHibernate.Properties.ChainedPropertyAccessor.GetSetter(键入类,字符串propertyName)
位于NHibernate.Transform.AliasToBeanResultTransformer.TransformTuple(对象[]元组,字符串[]别名)
在NHibernate.Loader.Criteria.CriteriaLoader.GetResultList(IList结果,IResultTransformer customResultTransformer)
在NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor会话,QueryParameters QueryParameters)
在NHibernate.Loader.Loader.List(ISessionImplementor会话,QueryParameters QueryParameters,ISet`1 QuerySpace,IType[]结果类型)
在NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor会话)中
在NHibernate.Impl.SessionImpl.List(CriteriaImpl标准,IList结果)
在NHibernate.Impl.CriteriaImpl.List(IList结果)
在NHibernate.Impl.CriteriaImpl.List[T]()
在NHibernate.criteria.QueryOver`1.List[U]()
在NHibernate.criteria.QueryOver`1.NHibernate.IQueryOver.List[U]()
在Tests.Entities.EmployeeFacts.QueryEmployees()中
这是我当前的代码:

Employee anEmployee = null;
Contact aContact = null;

session.QueryOver(() => anEmployee).Left
                .JoinAlias(() => anEmployee.Contact, () => aContact)
                .OrderBy(() => aGender.Name).Asc
                .ThenBy(() => aContact.FirstContact).Asc
                .SelectList(builder => builder.Select(() => aContact.FirstContact)
                                              .WithAlias(() => aContact.FirstContact)
                                              .Select(() => anEmployee.FirstName)
                                              .WithAlias(() => anEmployee.FirstName))
                .TransformUsing(Transformers.AliasToBean(typeof(Employee)))
                .List<Employee>();
Employee-anEmployee=null;
Contact a触点=空;
session.QueryOver(()=>anEmployee)。左
.JoinAlias(()=>anEmployee.Contact,()=>aContact)
.OrderBy(()=>aGender.Name).Asc
.ThenBy(()=>a第一次接触).Asc
.SelectList(builder=>builder.Select(()=>aContact.FirstContact)
.WithAlias(()=>aContact.FirstContact)
.选择(()=>anEmployee.FirstName)
.WithAlias(()=>anEmployee.FirstName))
.TransformUsing(Transformers.AliasToBean(typeof(Employee)))
.List();

对于您的选择列表,所有
with alias
方法都应该使用相同的dto,并且也应该是transformer中使用的相同类。另外,我不知道为什么要投影到映射实体中?投影用于平面dto


您看到的错误是由于无效的
。WithAlias(()=>aContact.FirstContact)
…NH transformer现在希望Employee类中有FirstContact属性。解决方案是创建一个包含FirstContact和FirstName属性的dto,并将其用于WithAlias和AliasToBean转换器。

您应该投影到某种类型的dto,其中只包含所需的字段,而不是试图投影到实体本身。@AndrewHitaker问题在于我的代码是动态的,这只是一个我试图做的是找出一个模式,这样我就可以用动态代码生成它。有什么办法可以用现有的变压器来做吗?或者我应该建造自己的变压器吗?!!