Запрос FluentNHibernate для объектов отношения «многие ко многим» - PullRequest
3 голосов
/ 14 января 2012

По какой-то причине я не могу получить этот запрос правильно, и я не могу понять, почему ...

У меня есть объект с именем «Блог», у которого есть Id, и список «Тегов».,Каждый «тег» имеет идентификатор и свойство «имя».

Поскольку это отношение «многие ко многим», у меня есть еще одна таблица под названием «blog_tags», соединяющая их.

Отображения выглядят следующим образомthis:

public class BlogsMapping : ClassMap<Blog>
{
    Table("blogs");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Content);
    HasManyToMany(x => x.Tags)
        .Table("Blog_Tags")
        .ParentKeyColumn("BlogId")
        .ChildKeyColumn("TagId")
        .Not.LazyLoad()
        .Cascade.All();
}

public class TagsMapping : ClassMap<Tag>
{
    Table("tags");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Name);
}

Я хотел бы получить список блогов, которые имеют все следующие (некоторый список) тегов.

Я хотел бы сделать что-то вроде этого:

public IList<Blog> Filter(string[] tags)
{
    var blogs = _session.QueryOver<Blog>()
        .Where(x => x.Tags.ContainsAll(tags));
    return blogs.ToList();
}

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

1 Ответ

2 голосов
/ 15 января 2012

Вы должны быть в состоянии сделать это примерно так:

string[] tagNames = new string[2]{ "Admins", "Users" };

using (NHibernate.ISession session = SessionFactory.GetCurrentSession())
{
    IList<Blog> blogsFound = session.QueryOver<Blog>()
                                    .Right.JoinQueryOver<Tags>(x => x.Tags)
                                    .WhereRestrictionOn(x => x.Name).IsIn(tagNames)
                                    .List<Blog>();

}

Редактировать

Ниже то, о чем я говорил с подзапросом. Это не подзапрос, но вы должны сначала получить список значений (имен тегов), которые вы не хотите включать в свои результаты.

string[] tagNames = new string[2]{ "Admins", "Users" };
IList<string> otherTags = 
    session.QueryOver<Tag>()
           .WhereRestrictionOn(x => x.Name).Not.IsIn(tagNames)
           .Select(x => x.Name)
           .List<string>();

string[] otherTagNames = new string[otherTags.Count];
otherGroups.CopyTo(otherTagNames, 0);

IList<Blog> blogsFound = 
    session.QueryOver<Blog>()
           .Right.JoinQueryOver<Tag>(x => x.Tags)
           .WhereRestrictionOn(x => x.Name).IsIn(tagNames)
           .WhereRestrictionOn(x => x.Name).Not.IsIn(otherTagNames)
           .List<Blog>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...