2011-12-20 76 views
0

我有一個對象在我的C#叫Market 4應用:如何使用NHibernate不使用PK返回一個對象?

public class Market : BusinessBase 
{ 
    public Market() 
    { 
    } 

    public virtual int Id { get; set; } 
    public virtual string Symbol { get; set; } 
    public virtual string Description { get; set; } 
} 

我有一個表中的SQL Server稱爲markets

CREATE TABLE [dbo].[markets](
    [marketId] [int] IDENTITY(1,1) NOT NULL, 
    [symbol] [varchar](10) NOT NULL, 
    [description] [varchar](30) NOT NULL, 
    [version] [int] NOT NULL, 
CONSTRAINT [PK_markets] PRIMARY KEY CLUSTERED 
    ([marketId] ASC) 
GO 
CREATE UNIQUE NONCLUSTERED INDEX [NIDX_markets_symbol] ON [dbo].[markets] ([symbol] ASC) 
GO 

我的映射文件是這樣的:

<class name="MooDB.BusinessLayer.Market" table="markets"> 
    <id name="Id" column="marketId" type="Int32"> 
     <generator class="native" /> 
    </id>   
    <version name="Version" column="version" type="integer" unsaved-value="0" /> 
    <property name="Symbol" column="symbol" type="string" length="10" /> 
    <property name="Description" column="description" type="string" length="30" not-null="true" />   
</class> 

我可以簡單地使用這種方法獲取由id數據庫市場:

public Market GetMarketById(int marketId) 
{ 
    ISession session = GetSession(); 
    return session.Get<Market>(marketId); 
} 

我想要做同樣的事情,但在符號票代替。 Symbol在數據庫中是唯一的,我想返回一個Market對象。我想這樣的代碼:

public Market GetMarketBySymbol(string symbol) 
{ 
    ISession session = GetSession(); 
    return session.Get<Market>(symbol); 
} 

我知道這是不對的,但有沒有辦法返回一個對象,它映射到一個獨特的行中的數據庫,但不通過 PK找回?我可以簡單地獲得Market對象的<IList>,然後使用'foreach'返回該對象,但這對我來說感覺不合適。

+0

你不想使用標準或HQL? – 2011-12-20 10:55:04

+0

我接受最優雅的解決方案。你會用什麼? – 2011-12-20 12:34:41

回答

4

如果使用NH 3 +,你可以使用LINQ:

return session.Query<Market>().SingleOrDefault(w => w.Symbol == symbol); 

或者QueryOver:

return session.QueryOver<Market>() 
    .Where(w => w.Symbol == symbol).SingleOrDefault(); 
+0

感謝'QueryOver'是我使用的方法。 – 2011-12-20 17:46:42

相關問題