Как выполнять запросы NHibernate с идентификатором ссылки в качестве критерия - PullRequest
2 голосов
/ 06 ноября 2010

Я пытаюсь выполнить запрос через NHibernate, где критерий результата зависит от идентификатора ссылочной таблицы.Как мне это сделать?Давайте рассмотрим простой пример:

public class Foo
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public Bar ReferencedBar { get; set; }
}    

public class Bar
{ 
    public int Id { get; set; }
    public string Name { get; set; }
}

Затем Foo отображается на Bar:

public class FooMapping : ClassMap<Foo>
{
    public FooMapping()
    {
        Id(c => c.Id).GeneratedBy.HiLo("1");
        Map(c => c.Name).Not.Nullable().Length(100);
        References(c => c.Bar);
    }
}

Теперь я хочу получить все Foo из базы данных, которые ссылаются на определенный Bar по идентификатору.Эта функция использует критерии, но, пожалуйста, приведите примеры, используя что-то еще, если вы считаете, что это лучше:

public IList<Foo> GetAllFoosReferencingBar(int barId)
{
    using (var tx = Session.BeginTransaction())
    {
        var result = Session.CreateCriteria(typeof(Foo))
            .Add(Restrictions./* foo.ReferencedBar == id */) // <-- How to add restriction using id? 
            .List<Foo>();
        tx.Commit();
        return result; 
    }
}

Когда я пытаюсь сделать это с помощью, я получаю исключение:

.Add( Restrictions.Eq( "ReferencedBar", 32 ) );

Несоответствие типов в NHibernate.Criterion.SimpleExpression: ожидаемый тип ReferencedBar Bar, фактический тип System.Int32

У меня еще нет ссылочного объекта на Bar с идентификатором 32 и я не хочу его создавать ...

Ответы [ 2 ]

4 голосов
/ 12 августа 2011

Если Bar загружается с отложенной загрузкой (по умолчанию), то вы можете «Загрузить» прокси-сервер Bar с его идентификатором.Вы можете передать этот экземпляр прокси в качестве ссылки на Bar по следующим критериям:

 var result = Session.CreateCriteria(typeof(Foo))
     .Add(Expression.Eq("ReferenceBar", Session.Load<Bar>(barId)))
     .List<Foo>();

В результате вы получите ожидаемый SQL-запрос без необходимости присоединяться к Bar.

2 голосов
/ 06 ноября 2010

CreateAlias должен помочь вам, вот так:

 var result = Session.CreateCriteria(typeof(Foo))
     .CreateAlias("ReferencedBar", "bar")
     .Add(Expression.Eq("bar.Id", barId))
     .List<Foo>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...