是否可以在NHibernate中智能地映射DTO?

是否可以在NHibernate中智能地映射DTO?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,如果我想从类的属性创建DTO,所有这些属性都是映射的,我可以不编写常规SQL语句就创建DTO吗 我已经看过很多关于DTO类的制作和使用的文档,但是关于如何创建DTO类的文档并不多。我见过SQL查询与Transformer一起使用,但这需要使用魔术字符串 编辑: 谢谢你的评论。我知道有多种方法可以检索DTO,但我一直找不到不使用SQL/HQL的方法的示例。有什么参考资料吗,或者这是NHibernate中文档稀少的区域之一?您可以加载所有必要的实体并使用AutoMapper更容易地将其映射到DTO?

如果我想从类的属性创建DTO,所有这些属性都是映射的,我可以不编写常规SQL语句就创建DTO吗

我已经看过很多关于DTO类的制作和使用的文档,但是关于如何创建DTO类的文档并不多。我见过SQL查询与Transformer一起使用,但这需要使用魔术字符串

编辑:


谢谢你的评论。我知道有多种方法可以检索DTO,但我一直找不到不使用SQL/HQL的方法的示例。有什么参考资料吗,或者这是NHibernate中文档稀少的区域之一?

您可以加载所有必要的实体并使用AutoMapper更容易地将其映射到DTO?

您可以加载所有必要的实体并使用AutoMapper更容易地将其映射到DTO?

根据您最近的评论,这里有一些使用
QueryOver
Linq

使用QueryOver:-

var schoolList = Session.QueryOver<lmschool>()
         .SelectList(i => i
         .Select(p => p.Name).WithAlias(() => dto.Name)
         .Select(p => p.Lat).WithAlias(() => dto.Lat)
         .Select(p => p.Lng).WithAlias(() => dto.Lng)
       )
       .Where(w => w.Lat != null && w.Lng != null)
       .TransformUsing(Transformers.AliasToBean<MarkerDto>())
       .List<MarkerDto>();
var schoolList=Session.QueryOver()
.选择列表(i=>i
.Select(p=>p.Name).WithAlias(()=>dto.Name)
.Select(p=>p.Lat).WithAlias(()=>dto.Lat)
.使用别名(()=>dto.Lng)选择(p=>p.Lng)
)
.其中(w=>w.Lat!=null和&w.Lng!=null)
.TransformUsing(Transformers.AliasToBean())
.List();
使用NH Linq提供程序:-

var schoolList = (from school in Session.Query<lmschool>()
        .Where(w => w.Lat != null && w.Lng != null)
      select new LmSchoolMarkerDto {
            Name = school.Name,
                    Lat = school.Lat,
                    Lng = school.Lng,
      }).ToList();
var schoolList=(来自会话中的学校。Query()
.其中(w=>w.Lat!=null和&w.Lng!=null)
选择新的LMSchoolMarkerTo{
Name=学校。Name,
Lat=学校,Lat,
Lng=学校,
}).ToList();
来源于 此外,如果您需要了解如何使用多个联接,请参见此


还有很多S.O.的帖子可以帮助你,看看这个。

从你最近的评论中,这里有一些使用
QueryOver
Linq
投射DTO的例子

使用QueryOver:-

var schoolList = Session.QueryOver<lmschool>()
         .SelectList(i => i
         .Select(p => p.Name).WithAlias(() => dto.Name)
         .Select(p => p.Lat).WithAlias(() => dto.Lat)
         .Select(p => p.Lng).WithAlias(() => dto.Lng)
       )
       .Where(w => w.Lat != null && w.Lng != null)
       .TransformUsing(Transformers.AliasToBean<MarkerDto>())
       .List<MarkerDto>();
var schoolList=Session.QueryOver()
.选择列表(i=>i
.Select(p=>p.Name).WithAlias(()=>dto.Name)
.Select(p=>p.Lat).WithAlias(()=>dto.Lat)
.使用别名(()=>dto.Lng)选择(p=>p.Lng)
)
.其中(w=>w.Lat!=null和&w.Lng!=null)
.TransformUsing(Transformers.AliasToBean())
.List();
使用NH Linq提供程序:-

var schoolList = (from school in Session.Query<lmschool>()
        .Where(w => w.Lat != null && w.Lng != null)
      select new LmSchoolMarkerDto {
            Name = school.Name,
                    Lat = school.Lat,
                    Lng = school.Lng,
      }).ToList();
var schoolList=(来自会话中的学校。Query()
.其中(w=>w.Lat!=null和&w.Lng!=null)
选择新的LMSchoolMarkerTo{
Name=学校。Name,
Lat=学校,Lat,
Lng=学校,
}).ToList();
来源于 此外,如果您需要了解如何使用多个联接,请参见此


还有很多S.O.帖子可以帮助您,请看这一点。

我见过Transformer使用的SQL查询,但这需要使用神奇字符串
-这不是真的,您可以将HQL、SQL、Criteria、QueryOver和NH Linq转换为DTO。。。你使用的是什么版本的NH,当你聪明地说你的意思是什么时,“魔弦”并不是你认为它的意思谢谢你@Rippo的建设性反馈。我问题的重点是澄清我的选择是什么。您是否有使用Criteria/Queryover/Linq执行此操作的参考资料?我似乎找不到任何东西。至于@Diego,对我来说,魔术字符串是任何与对象名称没有智能连接的东西,它只是指向某个对象的“字符串”。在这种情况下,即使是HQL查询也是一个神奇的字符串。如果更改对象的名称,SQL/HQL查询中对它的所有引用都将失效。感谢您的回复并提供了建设性的信息。好吧,对于世界其他地方来说,“神奇字符串”是一个字符串常量,没有解释的含义,应该变成常量。计算机不认为“智能”连接是不存在的。
我见过SQL查询与Transformer一起使用,但这需要使用魔术字符串
-这不是真的,你可以将HQL、SQL、Criteria、QueryOver和NH Linq转换成DTO。。。你使用的是什么版本的NH,当你聪明地说你的意思是什么时,“魔弦”并不是你认为它的意思谢谢你@Rippo的建设性反馈。我问题的重点是澄清我的选择是什么。您是否有使用Criteria/Queryover/Linq执行此操作的参考资料?我似乎找不到任何东西。至于@Diego,对我来说,魔术字符串是任何与对象名称没有智能连接的东西,它只是指向某个对象的“字符串”。在这种情况下,即使是HQL查询也是一个神奇的字符串。如果更改对象的名称,SQL/HQL查询中对它的所有引用都将失效。感谢您的回复并提供了建设性的信息。好吧,对于世界其他地方来说,“神奇字符串”是一个字符串常量,没有解释的含义,应该变成常量。计算机不认为“智能”连接是不存在的。谢谢你的回复。这些例子正是我想要的。巧合的是,我看到了你的博客文章,并且一直在引用它。我在上面看到的关于NHibernate的DTO的大多数帖子都是一般性的问题,假设每个人都知道如何检索它们。谢谢你的回复。这些例子正是我想要的。巧合的是,我看到了你的博客文章,并且一直在引用它。我在网上看到的关于NHibernate的DTO的大多数帖子都是一般性的问题,假设每个人都知道如何检索它们。