2017-01-27 8 views
0

여기서 무슨 일이 일어나고 있는지 이해할 수 없습니다. NHibernate를 사용하여 일부 결과를 가져 오려고하면 루프가됩니다.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()1이라면 잘 작동하고 3을 반환하지만 IEnumerable은 작동하지 않습니다.

Correct

그러나 그것은 다음과 같은 쿼리를 통해 이상 반복 유지 :

이 내가 찾고 있어요 그것이 맞습니다 확인하고 데이터를 얻을 수있는 첫 번째 줄의 콘솔에서 출력
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 [email protected];@p0 = 97857 [Type: Int32 (0:0:0)] 

당신은 여기에서 볼 수 있듯이 :

Loop

답변

0

당신의 전화/사용을 게시 할 수 있습니다 "ObtenerOrdenesPorMaquina (x)는"

내가 quess 같은 것을 몇 가지 :

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

당신이 여러 열거 문제가 저하 될 수 있습니다. 당신은 당신이 가장 가능성이 쿼리에서 IEnumerable을 통해 ReadOnlyCollection 또는 목록을 반환 고려 wan't

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

를 사용하는 경우

어떻게 쿼리가 작동 않습니다. SQL 쿼리를 통해 열거하는 유스 케이스가 없기 때문에 대신 채워진 목록이 있습니다. 이 열거 형은 쿼리가 실행될 때 알지 못하는 복잡성을 초래합니다. db 세션을 닫은 후에도 가능합니다.