2014-01-03 3 views
0

При использовании ReferencesAny <> существует .EntityTypeColumn ("MyType"), который не отображается в приложении. Можно ли запросить этот столбец с помощью HQL или что-то еще и как интегрироваться в мои запросы LINQ to HQL?FluentNhibernate - запрос с отзывамиAny

ответ

0

Как просто сопоставить столбец в сущности, с которой вы ссылаетесь. Например, базовый класс для всех типов типов?

+0

Не уверен, что вы думаете. Не могли бы вы добавить образец. Просто быстро один? –

+0

Я имею в виду, что если вы хотите получить доступ к этому столбцу, вам просто нужно добавить свойство к вашей сущности, на которое ссылаются ссылки ReferencesAny и сопоставить столбец с этим свойством ... – MichaC

+0

Ах да .. это. Однако есть ли способ сделать это с помощью HQL и интегрироваться с LINQ to HQL? –

1

Как всегда, NHibernate имеет решение для (почти) все.

Давайте предположим, что отображение, как это (ala documentation):

ReferencesAny(x => x.AnyEntity) // the property name is AnyEntity... used below 

    // some explicit mapping 
    .AddMetaValue<Household>(typeof(Employee).Name) 
    .AddMetaValue<Client>(typeof(Contact).Name) 

    // the essence of <any> 
    .EntityTypeColumn("MyType") 
    .EntityIdentifierColumn("TheId") 
    .IdentityType<int>(); 

процитировать из дока: 14.7. The where clause:

Кроме того, особое свойство class обращается значение дискриминатора экземпляра в случай полиморфной персистенции. Имя класса .Net, встроенное в предложение where, будет переведено на его значение дискриминатора.

Итак, теперь мы сообщили, NHibernate, что colunn MyType содержит type, то эквив на C# type. Потому что мы можем получить доступ к EntityTypeColumn через .class - этот запрос даст нам то, что мы хотим:

// the 'Contact' represents the value contained in DB... 
var hql = "from MyEntity where AnyEntity.class = 'Contact' "; 
... 
session.CreateQuery(hql) 
     .List<MyEntity>(); 

это будет генерировать WHERE ... MyType = 'Контакт'

То же самое в QueryOver:

var query = session.QueryOver<MyEntity>() 
    .Where(x => x.AnyEntity is Contact) 
    .List<MyEntity>(); 

Примечание: плохие новости, что со встроенным поставщика LINQ, подобный запрос не удается. Я предполагаю, что это ошибка. То есть это не работает session.Query<MyEntity>().Where(x => x.AnyEntity is Contact), порождая неправильно ИНЕК

РАСПРОСТРАНЕНИЕ как просил в комментариях

Мы также можем фильтровать по <any> элементы ID, то 'EntityIdentifierColumn'

Синтаксис будет выглядеть следующим образом (см магическая «.id» селектор ")

query 
    ... 
    .Where(Restrictions.In("AnyEntity.id", new[] {1, 2, 3, 4, 5, 6, 7, 8})) 
    ... 
+0

есть способ фильтрации с помощью EntityIdentifierColumn, отображаемого как «TheId» в этом примере? Как .Where (TheId in (listsOfIds))? – TiagoBrenck

+1

Я продлил ответ. И да, это возможно. Нам нужен волшебный селектор «id»;) –

Смежные вопросы