Как использовать WHERE во ManyToMany без ненужных соединений - PullRequest
0 голосов
/ 27 июня 2018

Я хочу написать запрос 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 

Я перепробовал много вещей, но ни одна из них не сработала, я не уверен, что это вообще возможно, но был бы очень рад получить ответ на этот вопрос

...