Как оптимизировать этот запрос NHibernate 3.2 linq
Допустим, у меня есть следующие 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 ответ
Похоже, что эта оптимизация не реализована для 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};