【问题标题】:How do I stop AutoMapper from making two identical SELECT statements with NHibernate?如何阻止 AutoMapper 使用 NHibernate 创建两个相同的 SELECT 语句?
【发布时间】:2010-09-17 20:01:03
【问题描述】:

我有一个名为 Incident 的实体和一个名为 IncidentDTO 的 DTO。目前,IncidentDTO 看起来像这样:

public class IncidentDTO : Incident
{
    // empty until I can get AutoMapper working correctly
}

我正在尝试提取数据库中所有 Incidents 的列表,并使用以下代码将它们转换为 DTO:

Mapper.CreateMap<Incident, IncidentDTO>();

using (var session = SessionFactory.OpenSession())
{
    var incidents = session.Linq<Incident>();
    var incidentDTOs = Mapper.Map(incidents, new List<IncidentDTO>());
}

这段代码运行良好,但当我使用 NHProf 查看正在生成的 SQL 语句时,我得到了这个:

SELECT ... FROM [Incident] this_
SELECT ... FROM [Incident] this_

这两个 SELECT 语句完全相同。为什么 AutoMapper 会生成两个相同的 SELECT 语句,我该如何防止它这样做?

【问题讨论】:

    标签: sql nhibernate automapper projection


    【解决方案1】:

    猜测:枚举 IQueryable 会为每个项目创建一个单独的选择。通过枚举 IList 来解决它。

    var incidents = session.Linq<Incident>().ToList();
    

    我可能会这样做以防止另一个问题。

    int someReasonableNumber = 1000;
    var incidents = session.Linq<Incident>().Take(someReasonableNumber).ToList();
    

    这只是猜测,不是我真正知道的。

    【讨论】:

    • 成功了,谢谢!我没有考虑先枚举可查询的。至于未绑定的集合,这不是问题,因为我预计Incident 的计数不会超过 200。
    【解决方案2】:

    我认为你的问题与这个issue有关:

    【讨论】:

    • 不幸的是,这不是 SELECT N+1 问题。 Incident 不与其他任何内容相关联。
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多