Cómo optimizar esta consulta linq de NHibernate 3.2

Digamos que tengo las siguientes 2 entidades. (Por favor, perdone cualquier error tipográfico, estoy siendo un poco insomne ​​y estoy escribiendo esto de memoria)

public class Foo {
   public virtual int Id {get;set;}
   public virtual int Version {get;set;}
   public virtual string SomeProp {get;set;}
   public virtual Bar Bar {get;set;}
}

public class Bar {
   public virtual int Id {get;set;}
   public virtual int Version {get;set;}
   public virtual string Name {get; set;}
}

//Fluent Mappings
public class FooMapping :ClassMap<Foo>
{
    public FooMapping()
    {
        Id (f => f.Id).GeneratedBy.Identity();
        Version(f => f.Version);
        Map(f=> f.SomeProp).Column("fooprop1");
        References(f => f.Bar).Column("foobarid").Not.Null();
    }
}

public class BarMapping :ClassMap<Bar>
{
    public BarMapping()
    {
        Id (b => b.Id).GeneratedBy.Identity();
        Version(b => b.Version);
        Map(b => b.name).Column("barname");
    }
}

cuando escribo una consulta como esta:

var query = from f in Session.Query<Foo>()
            where f.Bar.Id == 5
            select new {f.Id, f.SomeProp};

Noto que NHibernate genera una consulta sql con una combinación interna a la tabla Bar, y luego lo hace en la cláusula where en el Id de la tabla Bar. Sospecho que hace esto para asegurarse de que bar.id = 5 es una identificación de barra válida.

Mi pregunta es cómo puedo decirle a NHibernate que me permita consultar la tabla foo solo contra la columna foo.foobarid. Algo como esto:

SELECT f.id, f.prop1 FROM foo f WHERE f.foobarid = 5

¡Gracias de antemano por cualquier información que pueda proporcionar!

preguntado el 08 de noviembre de 11 a las 10:11

1 Respuestas

Parece que esta optimización no está implementada para Linq (está documentada y funciona para HQL).

Pero puedes usar un Bar objeto de la comparación como solución. session.load() no afectará a la base de datos, por lo que no hay un costo de rendimiento adicional por eso.

var bar = Session.Load<Bar>(5);
var query = from f in Session.Query<Foo>()
            where f.Bar == bar
            select new {f.Id, f.SomeProp};

respondido 08 nov., 11:15

¡Gracias por la respuesta! ¡Funcionó perfectamente! Con suerte, las versiones posteriores de NH-Linq utilizarán esta optimización, pero esto funciona para mí en este momento. - NYCChris

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.