2011-02-06 13 views
2

C#NHibernate問題 - 我試圖返回不同的值。C#NHibernate問題 - 我試圖返回不同的值

這是我到目前爲止有:

IList<TaskFor> objsResult = session.CreateCriteria(typeof(TaskFor)).setProjection(Projections.Distinct).List<TaskFor>(); 

return objsResult; 

我試圖返回一組值,但我需要刪除重複。 我似乎無法得到設置投影適用於此實例。

期待聽到任何答案。

感謝,

馬克

回答

4

我想說從艾丹·博伊爾this答案可能是你非常有幫助。

要執行不同的查詢,您可以將條件上的投影設置爲Projections.Distinct。然後包括您想要返回的列。然後通過將結果轉換器設置爲AliasToBeanResultTransformer - 將結果轉換成的類型傳入,然後將結果轉回爲強類型對象。在這個例子中,我使用與實體本身相同的類型,但是您可以專門爲此查詢創建另一個類。

ICriteria criteria = session.CreateCriteria(typeof(Person)); 
criteria.SetProjection(
    Projections.Distinct(Projections.ProjectionList() 
     .Add(Projections.Alias(Projections.Property("FirstName"), "FirstName")) 
     .Add(Projections.Alias(Projections.Property("LastName"), "LastName")))); 

criteria.SetResultTransformer(
    new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person))); 

IList people = criteria.List(); 

這將創建類似於SQL(SQL Server中至少):

SELECT DISTINCT FirstName, LastName from Person 

請注意,只有您在投影中指定的屬性將是在結果中填充。

此方法的優點是過濾在數據庫中執行,而不是將所有結果返回到您的應用程序,然後執行過濾 - 這是DistinctRootEntityTransformer的行爲。

+0

基本上我試圖傳遞一個值「TaskId」到這個方法中,並返回數據庫表中名爲「TaskFor」的行列表​​。在包含「TaskId」值的行中,必須在字段「Email」中包含Disinct。 – marc 2011-02-06 14:20:59