6

我有这种情况:

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)

因为这会给我用户关系。

我需要这样的东西:

Select distinct user.ID 
from UserRelationship relationship
inner join User user on user.ID = relationship.MemberUser_ID

请帮忙谢谢

4

2 回答 2

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”的不同“用户”列表。

var distinctMemberUsers = QueryOver.Of<UserRelationship>()
    .Select(x => x.MemberUser.Id);

var users = QueryOver.Of<User>()
    .WithSubquery.WhereProperty(x=>x.Id).In(distinctMemberUsers)

这应该在 SQL 中使用 In 子句为您提供不同的用户列表。

于 2011-05-23T10:58:25.887 回答
1

我知道这篇文章很旧,但我只是遇到了同样的问题,并认为我会分享一个我发现更简单的答案。

无论如何 - NHibernate 将不得不为每个父对象查询多行(除非您使用 SubSelect 而不是 Join)。正因为如此,我们知道我们将获得一个包含 500 个对象的列表,而实际上只有 100 个唯一对象。

既然这些对象已经被查询过,并且已经在内存中——为什么不使用 LINQ?

基于这个问题:LINQ's Distinct() on a specific property带有最多 + 的答案给出了一个非常有说服力的解决方案。创建另一个列表,并让 LINQ 进行不同的比较。如果我们可以在数据库上做不同的事情,那显然是更好的选择——但由于这不是一个选择,LINQ 似乎是一个很好的解决方案。

于 2012-02-13T02:52:57.173 回答