如何在简单的QueryOver中使用select

时间:2011-10-05 13:34:01

标签: nhibernate queryover

我有一个QueryOver在Nhibernate 3.1中的查询

   var q = SessionInstance.QueryOver<Person>()
           .Where(p => p.Code == code);
           .Select(p => p.Name,p => p.Code);


   return q.SingleOrDefault();

这个没有select的查询是正确的,但是select使用此消息有一个运行时错误:无法将类型为'System.String'的对象强制转换为'MyNameSpace.Domain.Entities.Person'。如何选择Person的某个字段?

1 个答案:

答案 0 :(得分:1)

您需要明确告诉NHibernate返回数据的类型是什么,因为您选择选择原始实体p.Name的某些特定属性,P.Code这些属性必须从新类型返回实体,因此新类型将是新的object

 var query = SessionInstance.QueryOver<Person>()
                 .Where(p => p.Code == code)
                 .Select(
                     p => p.Name,
                     p => p.Code
                 )
                 .List<object>();

这将解决您的问题

或者如果您定义了一个新实体来保存新的返回数据,如下所示:

public newPeople
{
     public Id { get; set; }
     public Nam { get; set; }
}

你可以这样写:

 var query = SessionInstance.QueryOver<Person>()
                 .Where(p => p.Code == code)
                 .Select(
                     p => p.Name,
                     p => p.Code
                 )
                 .Select( list =>
                    new newPeople()
                    {
                          Id = (int) list[0],
                          Name = (string) list[1]
                    })
                 .ToList<newPeople>();