2017-01-27 16 views
0

ここで何が起こっているのか分かりません。 NHibernateを使っていくつかの結果を取得しようとすると、ループに入ります。NHibernateが同じクエリを何度も何度も繰り返すことがありました

私はNHibernateにマップされた以下の2つのドメインオブジェクトを持っています。

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; 
    } 
} 

何もありません。それから私は、次のコードでそれらのいくつかを照会しています:私はOrdenesSinFinalizarEnvasadoPorMaquina呼び出すと

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(); 
    } 

それは、最初のクエリOKを行いますが、それが何度も同じクエリを繰り返すループに入った、と私はドン」理由を理解できない!

私がRowCount()と呼んだ場合、正常に動作し、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)) 
{ 
} 

あなたが複数の列挙問題を被る可能性があります。

どのようにあなたのクエリは、

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

を使用する場合は、最も可能性の高いクエリからIEnumerableを上ReadOnlyCollectionまたはListを返すことを検討するためにwan't振る舞うん。 SQLクエリで列挙するユースケースはなく、入力されたリストが代わりになるからです。列挙によって、クエリが実行されるときにわからない複雑さが生じます。多分あなたがdbセッションを閉じた後でさえ。

関連する問題