要執行不同的查詢,您可以設置投影關於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<Person> people = criteria.List<Person>();
這(至少在SQL Server)創建類似於SQL:
SELECT DISTINCT FirstName, LastName from Person
請注意,只有您在投影中指定的屬性將在結果來填充。
此方法的優點是過濾在數據庫中執行,而不是將所有結果返回到您的應用程序,然後執行過濾 - 這是DistinctRootEntityTransformer的行爲。
好吧,我從來沒有這樣做過,所以1快速的問題。我有一個主鍵,這是一個身份字段。我怎樣才能從結果集中排除這個字段,以便不同的結果真的不同?我可以澄清,如果沒有意義。 – 2008-11-25 19:20:35
我不知道這是否可能。你可以創建一個與其他字段的DTO,並針對該DTO進行查詢,但它需要使用hql。 – Juanma 2008-11-26 10:40:01
DistinctEntityRootTransformer來自哪裏? VS不會爲我解決它。我在某處丟失了一個程序集嗎? – BuddyJoe 2009-02-18 21:34:12