【问题标题】:NHibernate gets stuck repeating the same query over and overNHibernate 卡住了一遍又一遍地重复相同的查询
【发布时间】:2017-01-27 20:46:55
【问题描述】:

我不明白这里发生了什么。当我尝试使用 NHibernate 获取一些结果时,它进入了一个循环。

我有以下两个域对象,在 NHibernate 中映射。

public class Orden
{
    public virtual int Id { get; set; }
    public virtual Lanzamiento Lanzamiento { get; set; }
    public virtual DateTime FechaOrden { get; set; }
    public virtual IArticulo Articulo { get; set; }
    public virtual double Cantidad { get; set; }
    public virtual int IdEstado { get; set; }
    public virtual string Observaciones { get; set; }
    public virtual Lote Lote { get; set; }
    public virtual ISet<OrdenBono> Bonos { get; set; }
}

public class OrdenBono
{
    public virtual Orden Orden { get; set; }
    public virtual int Id { get; set; }
    public virtual string Descripcion { get; set; }
    public virtual ISet<OrdenBonoEntrada> Entradas { get; set; }
    public virtual ISet<OrdenBonoSalida> Salidas { get; set; }
    public virtual int IdEstado { get; set; }
    public virtual Maquina Maquina { get; set; }
    public override bool Equals(object obj)
    {
        OrdenBono u = obj as OrdenBono;
        if (u == null) return false;
        return u.Orden == Orden && u.Id == Id;
    }
    public override int GetHashCode()
    {
        int hash = 13;
        hash = hash * 7 + Orden.GetHashCode();
        hash = hash * 7 + Id.GetHashCode();
        return hash;
    }
}

那里没什么特别的。然后我通过以下代码查询其中一些:

public IQueryOver<Orden, Orden> QueryOrdenesPorMaquina(Maquina m)
    {
        ISession session = NHibernateHelper.GetSession();
        session.BeginTransaction();
        return session.QueryOver<Orden>()
                .WithSubquery.WhereProperty(o => o.Id)
                .In(
                QueryOver.Of<OrdenBono>()
                .Where(ob => ob.Maquina == m)
                .Select(ob => ob.Orden.Id)
                );
    }
    public IQueryOver<Orden> QueryOrdenesSinFinalizarEnvasadoPorMaquina(Maquina m)
    { 
            return QueryOrdenesPorMaquina(m)
             .WithSubquery.WhereProperty(o => o.Id).In(
                QueryOver.Of<OrdenBono>()
                .Where(ob => ob.Descripcion.IsLike("Prod%") && ob.IdEstado == 2)
                .JoinQueryOver(ob => ob.Orden)
                .JoinQueryOver<OrdenBono>(o2 => o2.Bonos)
                .Where(ob => ob.Descripcion.IsLike("Env%") && ob.IdEstado < 2)
                .Select(ob => ob.Orden.Id)
                );
    }
    public IEnumerable<Orden> ObtenerOrdenesPorMaquina(Maquina m)
    {
        return QueryOrdenesPorMaquina(m).List();
    }
    public IEnumerable<Orden> OrdenesSinFinalizarEnvasadoPorMaquina(Maquina m)
    {
        return QueryOrdenesSinFinalizarEnvasadoPorMaquina(m).List();
    }
    public int NumeroOrdenesSinFinalizarEnvasadoPorMaquina(Maquina m)
    {
        return QueryOrdenesSinFinalizarEnvasadoPorMaquina(m).RowCount();
    }

当我调用OrdenesSinFinalizarEnvasadoPorMaquina 时,它会执行第一个查询,但随后它会进入一个循环,一遍又一遍地重复相同的查询,我不明白为什么!

如果我调用RowCount()one,它可以正常工作并返回3,但IEnumerable 不起作用。这是第一行控制台的输出,我可以看到它是正确的,并得到了我正在寻找的数据:

但是它不断重复以下查询:

NHibernate: SELECT orden0_.IdOrden as IdOrd1_15_1_, orden0_.FechaOrden as Fecha2_15_1_, orden0_.IdArticulo as IdArt3_15_1_, orden0_.Cantidad as Canti4_15_1_, orden0_.Observaciones as Obser5_15_1_, orden0_.IdEstado as IdEst6_15_1_, orden0_.IdLanzamiento as IdLan7_15_1_, orden0_.Lote as Lote8_15_1_, bonos1_.IdOrden as IdOrd1_16_3_, bonos1_.IdBono as IdBon2_16_3_, bonos1_.IdOrden as IdOrd1_16_0_, bonos1_.IdBono as IdBon2_16_0_, bonos1_.Descrip as Descr3_16_0_, bonos1_.IdEstado as IdEst4_16_0_, bonos1_.Matricula as Matri5_16_0_ FROM Ordenes orden0_ left outer join Ordenes_Bonos bonos1_ on orden0_.IdOrden=bonos1_.IdOrden WHERE orden0_.IdOrden=@p0;@p0 = 97857 [Type: Int32 (0:0:0)]

如您所见:

【问题讨论】:

    标签: c# nhibernate queryover


    【解决方案1】:

    能否公布“ObtenerOrdenesPorMaquina(x)”的调用/用法

    一些我喜欢的问题:

    foreach(var x in ObtenerOrdenesPorMaquina(y))
    {
    }
    

    您可能会遇到多重枚举问题。

    如果您使用,您的查询会如何表现

    var allObtenereOrdersOfMaquinaY = ObtenerOrdenesPorMaquina(y).ToList();  
    foreach(var x in allObtenereOrdersOfMaquinaY)
    {
    }
    

    您很可能不会考虑从查询中返回 ReadOnlyCollection 或 List 而不是 IEnumerable。因为不会有一个用例来枚举 sql 查询,而是填充的列表。枚举引入了您不知道何时执行查询的复杂性。甚至在您关闭数据库会话之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2016-12-20
      相关资源
      最近更新 更多