簡體   English   中英

如何在NHibernate中查詢多對多關聯?

[英]How to query across many-to-many association in NHibernate?

我有兩個實體, PostTag Post實體具有一個Tag集合,該集合表示兩者之間的多對多聯接(即,每個帖子可以具有任意數量的標簽,並且每個標簽可以與任意數量的帖子相關聯)。

我正在嘗試檢索所有具有給定標簽的帖子。 但是,我似乎無法正確獲得此查詢。 我本質上想要的東西與以下偽HQL相同:

from Posts p
where p.Tags contains (from Tags t where t.Name = :tagName)
order by p.DateTime

我發現,唯一能做到這一點的就是Ayende的帖子 但是,他的方法要求另一側的實體(在我的示例中為Tag )具有一個集合,該集合表示多對多的另一端。 我沒有這個,也不是真的希望擁有它。 我發現很難相信這不可能完成。 我想念什么?


我的實體和映射如下所示(簡化):

public class Post {
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    private IList<Tag> tags = new List<Tag>();

    public virtual IEnumerable<Tag> Tags {
        get { return tags; }
    }

    public virtual void AddTag(Tag tag) {
        this.tags.Add(tag);
    }
}

public class PostMap : ClassMap<Post> {
    public PostMap() {
        Id(x => x.Id).GeneratedBy.HiLo("99");
        Map(x => x.Title);
        HasManyToMany(x => x.Tags);
    }
}

// ----

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

public class TagMap : ClassMap<Tag> {
    public TagMap () {
        Id(x => x.Id).GeneratedBy.HiLo("99");
        Map(x => x.Name).Unique();
    }
}

看起來我找到了答案。 不太確定為什么我沒想到昨天,但是您可以將其轉過來並in使用。

from Post p
where (
    select t 
    from Tag t 
    where t.Name = :tagName
) in elements(p.Tags)
order by p.DateTime

比我想的要容易。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM