2012-07-02 29 views
1

我有一個類,它看起來像:映射的集合與功能NHibernate子查詢

public class Competitor 
{ 
    public virtual int CompetitorId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 

    public virtual IEnumerable<string> SportsCompeted { get; set; } 
} 

SportsCompeted是解決像這樣的SportIDs(串)的列表:

SELECT DISTINCT SportID FROM results WHERE competitorId = xxx 

如何我會去映射類似的東西嗎?
看着HasMany,我可以指定一個Where子句,但我不認爲這正是我在尋找的這種情況?

我使用Fluent Mappings,爲簡潔起見省略。

回答

0

我最終什麼事做的是創造在SQL視圖,基本做到:

SELECT DISTINCT SportID, CompetitorID FROM results 

然後,在我的映射:

HasMany(x => x.CompetitorDisciplines) 
    .Not.LazyLoad() 
    .Inverse() 
    .AsBag() 
    .KeyColumn("competitorId") 
    .Element("DisciplineCode") 
    .Table("vCompetitorDisciplines"); 

這似乎產生了預期的結果。
慢,但它只是一次(或每天一次)操作....

1

您應該可以通過.Element()。喜歡的東西:

HasMany(x => x.SportsCompeted) 
    .KeyColumn("CompetitorId") 
    .Element("SportID") // You can define element type as second parameter 
    .Table("results"); 

更多信息:
Mapping collection of strings with NHibernate
Fluent NHIbernate automapping of List<string>?


編輯:

比方說,你有你的ResultSport實體,而不是:

public class Sport 
{ 
    public virtual int SportId { get; set; } 
    // Other properties 
} 

public class Result : Entity 
{ 
    public virtual ResultId { get; set; } 
    public virtual Competitor Competitor { get; set; } 
    public virtual Sport Sport { get; set; } 
    // Other properties 
} 

public class Competitor 
{ 
    public virtual int CompetitorId { get; set; } 
    public virtual IList<Result> Results { get; set; } 
    // Other properties 
} 

HasMany現在看起來是這樣的:

// For this, you would need to have Result and Sport classes mapped 
// This property isn't necessary for your Sports Competed query 
HasMany(x => x.Results) 
    .KeyColumn("CompetitorId") 
    .Table("results"); 

然後,你可以使用IE。 LINQ到得到結果,你想:

var sports = session.Query<Result>() 
    .Where(x => x.Competitor.CompetitorId = competitorId) 
    .Select(x => x.Sport) // Or .Select(x => x.Sport.SportId) 
    .Distinct(); 
+0

但這並沒有考慮到DISTINCT部分呢?或者我閱讀這個錯誤...?我的結果表格有許多SportID相同的CompetitorID – Alex

+0

對不起,我沒有看到'DISTINCT'子句。你說的對你的情況沒有任何幫助。我寧願在數據層中有一個單獨的查詢(HQL,Criteria,QueryOver或LINQ),它將通過'CompetitorId'獲得一個運動競爭id的列表。 –

+0

聽起來不錯...你有任何如何與Fluent合作的例子嗎? – Alex