2015-09-22 1 views
0

У меня есть объект «закладки», который имеет теги, которые являются строками. В C#, закладка Poco аналогична:Как использовать API критериев для запроса примитивных типов в отношениях «многие ко многим»?

public class BookmarkEntity 
{ 
    public virtual Guid Id { get; set; } 
    public virtual ISet<string> Tags { get; set; } 
} 

Я automapped сущность этой замены:

public class BookmarkEntityMappingOverride : IAutoMappingOverride<BookmarkEntity> 
{ 
    public void Override(AutoMapping<BookmarkEntity> mapping) 
    { 
     mapping.HasManyToMany(x => x.Tags).AsSet().Element("Value").Not.LazyLoad(); 
    } 
} 

Это создает эти две таблицы:

create table "BookmarkEntity" (
    Id UNIQUEIDENTIFIER not null, 
    primary key (Id) 
) 

create table Tags (
    BookmarkEntity_id UNIQUEIDENTIFIER not null, 
    Value TEXT, 
    constraint FK9061CD2928F7F2F9 foreign key (BookmarkEntity_id) 
            references "BookmarkEntity" 
) 

Теперь я Мне бы хотелось получить уникальный набор тегов из базы данных, поддерживаемой SQLite. В настоящее время я выполнения этого запроса:

SELECT DISTINCT Value FROM Tags ORDER BY Value 

Это делает то, что я хочу, но я хотел бы использовать критерии API, чтобы получить его немного более сильно типизированных. Я начал с этих усилий:

Session.CreateCriteria<BookmarkEntity>() 
     .SetProjection(
      Projections.Distinct(Projections.Property<BookmarkEntity>(b => b.Tags))) 
     .AddOrder(Order.Asc(Projections.Property("Value"))) 
     .List<string>(); 

Но это не работает, потому что он пытается запросить таблицу Закладок. Что мне нужно сделать, чтобы это было похоже на мой hardcoded SQL-запрос?

+0

Вы уверены, что HasManyToMany - правильное отображение только для списка строк? Я бы сомневался и предложил использовать Just HasMany ... –

+0

Я пошел туда и обратно, «HasMany», вероятно, имеет больше смысла. Мысль это в основном не относится к этому вопросу. –

ответ

1

Я хотел бы предложить, чтобы следовать этим

Для фильтрации (WHERE) с помощью коллекции, мы можем использовать: построить с "MyArray.elements"

.Add(Restrictions.Eq("Tags.elements", ...)); 

Для выбора мы должны добавить псевдоним (таргетинг colleciton) и запрос будет выглядеть следующим образом:

Session.CreateCriteria<BookmarkEntity>() 
     .CreateAlias("Tags", "t") 
     .SetProjection(
     // Projections.Distinct(Projections.Property<BookmarkEntity>(b => b.Tags)) 
     Projections.Distinct(Projections.Property("t.elements")) 
     ) 
     .AddOrder(Order.Asc(Projections.Property("t.elements"))) 
     .List<string>(); 

Кроме того, я хотел бы предложить, чтобы использовать только HasMany в случае сбора типа значения (IList<string>).

+0

Обе эти ссылки возвращают запрашиваемый тип; в моем случае это будет 'BookmarkEntity'. Но я хочу, чтобы вместо '' '' '' '' '' '' 'string, возвращаемого вместо этого ... –

+0

Я, скорее всего, плохо понимал заголовок *« Как использовать API критериев для ** запроса ** примитивных типов .. »* ... Я думал, вам нужно использовать это для предложения WHERE ... –

+0

А, нет. Я просто ищу эквивалентную конструкцию API критериев для предложения SQL в моем вопросе. –

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