Как оптимизировать этот запрос NHibernate 3.2 linq - PullRequest
2 голосов
/ 08 ноября 2011

Допустим, у меня есть следующие 2 сущности.(Пожалуйста, простите за любые опечатки кода, я немного бессонница и набираю это из памяти)

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

, когда я пишу такой запрос:

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

Я замечаючто NHibernate генерирует SQL-запрос с внутренним соединением к таблице Bar, а затем выполняет условие where в Id таблицы Bar.Я подозреваю, что это делает это, чтобы гарантировать, что bar.id = 5 является действительным идентификатором бара?

Мой вопрос состоит в том, как я могу сказать NHibernate, чтобы я мог запрашивать только таблицу foo для столбца foo.foobarid.Примерно так:

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

Заранее благодарим вас за любые идеи, которые вы можете предоставить!

1 Ответ

2 голосов
/ 08 ноября 2011

Похоже, что эта оптимизация не реализована для Linq (она задокументирована и работает для HQL).

Но вы можете использовать Bar объект для сравнения в качестве обходного пути. session.load() не ударит по БД, поэтому за это не нужно платить дополнительную производительность.

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