要执行不同的查询,您可以设置投影关于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