我有这个 情形:
class User
{
Id,
UserName
}
class UserRelationship
{
User GroupUser,
User MemberUser
}
and query
var query = QueryOver.Of<UserRelationship>()
.JoinqueryOver(x=>x.MemberUser)
.Where(x=>x.UserName == "TestUser");
现在我想返回List Distinct User,所以我无法做到
TransformUsing(Transformers.DistinctRootEntity)
因为这会给我UserRelationship。
我需要这样的东西:
Select distinct user.ID
from UserRelationship relationship
inner join User user on user.ID = relationship.MemberUser_ID
请帮忙 感谢
答案 0 :(得分:3)
鉴于课程:
public class User
{
public virtual int Id {get; set;}
public virtual string UserName {get; set;}
}
public class UserRelationship
{
public virtual int Id {get; set;}
public virtual User GroupUser {get; set;}
public virtual User MemberUser {get; set;}
}
流畅的映射:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x=>x.Id).GeneratedBy.Native();
Map(x=>x.UserName);
}
}
public class UserRelationshipMap : ClassMap<UserRelationship>
{
public UserRelationshipMap(){
Id(x=>x.Id).GeneratedBy.Native();
References(x=>x.GroupUser);
References(x=>x.MemberUser);
}
}
您想要从UserRelationship类中检索基于“MemberUser”的不同“User”列表。
var distinctMemberUsers = QueryOver.Of<UserRelationship>()
.Select(x => x.MemberUser.Id);
var users = QueryOver.Of<User>()
.WithSubquery.WhereProperty(x=>x.Id).In(distinctMemberUsers)
这应该使用SQL中的In子句为您提供不同的User列表。
答案 1 :(得分:1)
我知道这篇文章很老但是我遇到了同样的问题,并且认为我会分享一个我发现更简单的答案。
无论如何 - NHibernate必须为每个父对象查询多行(除非您使用SubSelect而不是Join)。因此,我们知道当真正只有100个唯一对象时,我们将获得500个对象的列表。
由于这些对象已经被查询,并且已经在内存中 - 为什么不使用LINQ?
基于这个问题:LINQ's Distinct() on a particular property最多+的回答给出了非常有说服力的解决方案。创建另一个列表,让LINQ进行不同的比较。如果我们可以在数据库中做出明显的选择,那么它显然是更好的选择 - 但由于这不是一个选项,LINQ似乎是一个很好的解决方案。