NHibernate:如何将ExpandoResultTransformer与Session.QueryOver一起使用

NHibernate:如何将ExpandoResultTransformer与Session.QueryOver一起使用,nhibernate,queryover,Nhibernate,Queryover,我创建了一个ExpandoResultTransformer,用于将查询结果转换为要在UI中使用的dto。看起来是这样的: public class ExpandoResultTransformer : IResultTransformer { public object TransformTuple(object[] tuple, string[] aliases) { dynamic toReturn = new Expan

我创建了一个ExpandoResultTransformer,用于将查询结果转换为要在UI中使用的dto。看起来是这样的:

  public class ExpandoResultTransformer : IResultTransformer
    {
        public object TransformTuple(object[] tuple, string[] aliases)
        {
            dynamic toReturn = new ExpandoObject();
            for (int i = 0; i < aliases.Length; i++)
            {
                ((IDictionary<string, object>)toReturn)[aliases[i]] = tuple[i];
            }
            return toReturn;
        }

        public IList TransformList(IList collection)
        {
            return collection;
        }
    }
公共类ExpandoResultTransformer:IResultTransformer
{
公共对象转换元组(对象[]元组,字符串[]别名)
{
dynamic toReturn=新的ExpandooObject();
for(int i=0;i
当我对createSQLQuery使用它时,它工作得非常好

var contacts = _session.CreateSQLQuery("exec up_ClientContactsView @ClientId=:clientId")
                                   .SetParameter("clientId", request.ClientId)
                                   .SetResultTransformer(new ExpandoResultTransformer())
                                   .List<dynamic>();
var contacts=\u session.CreateSQLQuery(“exec up\u clientcontacts视图@ClientId=:ClientId”)
.SetParameter(“clientId”,request.clientId)
.SetResultTransformer(新的ExpandoResultTransformer())
.List();
然而,当我试图用它对付QueryOver时,我遇到了麻烦。没有发送别名。所以我试着这样指定它们

var periodTables = _session.QueryOver<PeriodTable>()
                           .Where(x => x.ClientPolicy.Id == request.ClientPolicyId)
                           .SelectList(list => list
                              .Select(i =>i.Id).WithAlias(()=>info.PeriodTableId) !! does not work as dynamic cannot be used in expression error
                               .Select(i => i.Id).WithAlias(()=>"PeriodTableId" !!! does not work either as it cannot find member error
                           .TransformUsing(new ExpandoResultTransformer())
                           .List<dynamic>();
var periodTables=\u session.QueryOver()
.Where(x=>x.ClientPolicy.Id==request.ClientPolicyId)
.SelectList(list=>list
.Select(i=>i.Id)。WithAlias(()=>info.PeriodTableId)!!不作为动态工作,无法在表达式错误中使用
.Select(i=>i.Id)。WithAlias(()=>“PeriodTableId”!!!也不起作用,因为它找不到成员错误
.TransformUsing(新的ExpandoResultTransformer())
.List();

您知道如何传入别名吗?

您可以使用匿名类型实例作为模板对象:

var template = new { PeriodTableId = 0 };

var periodTables = _session.QueryOver<PeriodTable>()
                       .Where(x => x.ClientPolicy.Id == request.ClientPolicyId)
                       .SelectList(list => list
                          .Select(i =>i.Id).WithAlias(()=>template.PeriodTableId) 
                          )
                       .TransformUsing(new ExpandoResultTransformer())
                       .List<dynamic>();
var-template=new{PeriodTableId=0};
var periodTables=\u session.QueryOver()
.Where(x=>x.ClientPolicy.Id==request.ClientPolicyId)
.SelectList(list=>list
.Select(i=>i.Id).WithAlias(()=>template.PeriodTableId)
)
.TransformUsing(新的ExpandoResultTransformer())
.List();

太棒了,忘了匿名。