powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: Перевести с HQL на Criteria API
4 сообщений из 4, страница 1 из 1
NHibernate: Перевести с HQL на Criteria API
    #37025741
SergASh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Помогите перевести запрос с HQL на Criteria API. Есть два класса сущностей, не связанных в маппингах никакими асоциациями
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Entity1
{
  public int Id;
  public string Name;
}
class Entity2
{
  public int Id;
  public string Name;
}
и запрос на HQL вида
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT e1
  FROM Entity1 e1, 
       Entity2 e2 
  WHERE e1.Name = e2.Name
        AND
        e2.Id IN ( :Ids )

Непонятно как на Criteria выразить связь e1 и e2. У ICriteria вроде бы только есть методы для хождения по ассоциациям, а тут никаких ассоциаций нет.

Спасибо.
...
Рейтинг: 0 / 0
NHibernate: Перевести с HQL на Criteria API
    #37026365
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergASh,

можно так (общая идея):

DetachedCriteria dc = DetachedCriteria.For<Entity2>().Add(Restrictions.IdEq(ids)).SetProjection(Projections.Property("Name"));

var ent1 = CreateCriteria(typeof(Entity1)).Add(Subqueries.PropertyEq("Name", dc).List<Entity1>();
...
Рейтинг: 0 / 0
NHibernate: Перевести с HQL на Criteria API
    #37026569
SergASh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
barser, спасибо за идею

После небольших правок заработало:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
var dc = DetachedCriteria
  .ForEntityName( "Entity2" )
  .Add( Restrictions.InG( Projections.Id(), Ids ) )
  .SetProjection( Projections.Property( "Name" ) );

var criteria = session
  .CreateCriteria( "Entity1" )
  .Add( Subqueries.PropertyIn( "Name", dc ) );
Но я слишком упростил условия. В действительности нужно так
Код: plaintext
1.
2.
3.
4.
5.
6.
class Entity
{
  public int Id;
  public string Name;
  public long Type;
}
И HQL, соответственно, будет таким
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT e1
  FROM Entity e1, 
       Entity e2 
  WHERE e1.Name = e2.Name
        AND
        e1.Type = e2.Type
        AND
        e2.Id IN ( :Ids )

Как быть в таком случае? Ведь Subqueries.PropertyIn не умеет работать с группой полей, да и в T-SQL оператор IN поддерживает только одиночное поле.
...
Рейтинг: 0 / 0
NHibernate: Перевести с HQL на Criteria API
    #37026995
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergASh,

мне тоже было бы интересно это узнать...

можно попробовать создать DetachedCriteria dc, не задавая в конце цепочки SetProjection().
А уже в каждом подзапросе задавать интересующую проекцию Subqueries( ... , dc.SetProjection(...)).

Но это так... теория, надо пробовать :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: Перевести с HQL на Criteria API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]