Я хочу написать запрос NHibernate, используя QueryOver, который соединяет сущность с другой сущностью, имеющей отношение «многие ко многим», и возвращает только результаты, соответствующие условию «где». Извините, если это немного сбивает с толку, но это также сбивает меня с толку.
public class SomeEntity{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual Foo Foo { get; set; }
}
public class Foo{
public virtual int ID { get; set; }
public virtual IList<Bar> BarList { get; set; }
}
public class Bar{
public virtual int ID { get; set; }
public virtual IList<Foo> FooList { get; set; }
}
public class MapSomeEntity : ClassMap<SomeEntity>{
public MapSomeEntity(){
Id(x => x.ID).Column("id_some_entity");
Id(x => x.Name).Column("ds_name");
References(x => x.Foo, "id_foo_fk").Cascade.None();
}
}
public class MapFoo : ClassMap<Foo>{
public MapFoo(){
Id(x => x.ID).Column("id_foo");
HasManyToMany(x => x.BarList).Cascade.All().Table("foo_bar").ParentKeyColumn("id_foo_fk").ChildKeyColumn("id_bar_fk");
}
}
public class MapBar : ClassMap<Bar>{
public MapBar(){
Id(x => x.ID).Column("id_bar");
HasManyToMany(x => x.FooList).Cascade.All().Table("foo_bar").Inverse().ParentKeyColumn("id_bar_fk").ChildKeyColumn("id_foo_fk");
}
}
И этот запрос:
SomeEntity e = null;
Foo foo = null;
Bar bar = null;
Session.QueryOver(() => e)
.Where(() => e.Name == "Something")
.JoinAlias(() => e.Foo , () => foo)
.JoinAlias(() => foo.BarList, () => bar)
.Where(() => bar.ID == 50)
.SelectList(list => list
.Select(() => e.ID)
.Select(() => e.Name));
, который генерирует этот запрос:
SELECT e.id_some_entity, e.ds_name FROM some_entity e
inner join foo f on e.id_foo_fk = f.id_foo
inner join foo_bar fb on f._id_foo = fb.id_foo_fk
inner join bar b on fb.id_bar_fk = b.id_bar WHERE b.id_bar = 50
Но в этом запросе есть несколько ненужных объединений, я хочу вот что:
SELECT e.id_some_entity, e.ds_name FROM some_entity e
inner join foo_bar fb on e._id_foo_fk = fb.id_foo_fk
WHERE fb.id_bar_fk = 50
Я перепробовал много вещей, но ни одна из них не сработала, я не уверен, что это вообще возможно, но был бы очень рад получить ответ на этот вопрос