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)

これは私にUserRelationshipを与えるからです。

私はこのようなものが必要です:

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」に基づいて個別の「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句を使用して、ユーザーの明確なリストを提供する必要があります。

于 2011-05-23T10:58:25.887 に答える
1

私はこの投稿が古いことを知っていますが、私はちょうど同じ問題に遭遇し、私がはるかに簡単であることがわかった答えを共有すると思いました。

何があっても-NHibernateは親オブジェクトごとに複数の行をクエリする必要があります(Joinの代わりにSubSelectを使用する場合を除く)。このため、実際には100個の一意のオブジェクトしかない場合に、たとえば500個のオブジェクトのリストを取得することがわかります。

これらのオブジェクトはすでにクエリされており、すでにメモリ内にあるので、LINQを使用してみませんか?

この質問に基づいて:特定のプロパティに対するLINQのDistinct()は、 +が最も多い答えが非常に雄弁な解決策を提供します。別のリストを作成し、LINQに明確な比較を行わせます。データベースで区別できるのであれば、それは明らかに優れたオプションですが、それはオプションではないため、LINQは優れたソリューションのようです。

于 2012-02-13T02:52:57.173 に答える