NHibernate QueryOver отличается - PullRequest
6 голосов
/ 11 мая 2011

У меня есть это Сценарий:

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

Пожалуйста, помогите спасибо

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

с учетом классов:

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);
    }
}

Вы хотите получить список отдельных «Пользователей» на основе «MemberUser» из класса UserRelationship.

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

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

Это должно использовать предложение In в SQL, чтобы дать вам отдельный список User.

1 голос
/ 13 февраля 2012

Я знаю, что этот пост старый, но я только что столкнулся с той же проблемой и подумал, что поделюсь ответом, который мне показался намного более простым.

Независимо от того, что - NHibernate должен будет запросить несколько строк для каждого родительского объекта (если вы не используете SubSelect вместо Join). Из-за этого мы знаем, что получим список, скажем, 500 объектов, тогда как на самом деле есть только 100 уникальных объектов.

Поскольку эти объекты уже запрошены и уже находятся в памяти - почему бы не использовать LINQ?

Исходя из этого вопроса: LINQ's Distinct () для определенного свойства ответ с большинством + дает очень красноречивое решение. Создайте другой список и попросите LINQ провести четкое сравнение. Если бы мы могли сделать что-то особенное в базе данных, это, безусловно, было бы лучшим вариантом, но поскольку это не вариант, LINQ, похоже, является хорошим решением.

...