我想說從艾丹·博伊爾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的行爲。
基本上我試圖傳遞一個值「TaskId」到這個方法中,並返回數據庫表中名爲「TaskFor」的行列表。在包含「TaskId」值的行中,必須在字段「Email」中包含Disinct。 – marc 2011-02-06 14:20:59