2015-09-22 50 views
0

我有一個「書籤」實體,其標籤是字符串。在C#中,書籤波科是類似於:如何使用Criteria 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 

這是我想要的,但我想使用Criteria API來獲得更強的輸入。我開始努力:

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

但是,這不起作用,因爲它試圖通過書籤表進行查詢。我需要做些什麼才能使它與我的硬編碼SQL查詢相似?

+0

你確定,HasManyToMany只是一個字符串列表的正確映射嗎?我懷疑,並建議只使用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>(); 

另外,我建議,在價值型集合(IList<string>)的情況下,只需使用HasMany

+0

這兩個鏈接都返回被查詢的類型;在我的情況下,它將是'BookmarkEntity'。但我想要'string's返回,而不是... –

+0

我很可能不太理解標題*「我如何使用Criteria API來查詢**原始類型..」* ...我以爲你需要使用WHERE子句... –

+0

啊,沒有。我只是在我的問題中尋找SQL語句的等效Criteria API結構。 –