2011-05-11 14 views
6

que tiene este escenario :NHibernate QueryOver distinta

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

Ahora quieren volver Lista Distinto del usuario, por lo que no puede hacer

TransformUsing (Transformers.DistinctRootEntity)

porque esto me dará la UserRelationship.

necesito algo como esto:

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

Por favor, ayudar a gracias

Respuesta

3

Dadas las clases:

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

Y las asignaciones de fluidez:

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

Desea recuperar una lista de "Usuario" distinto en función de "Usuario miembro" de la clase UserRelationship.

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

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

Esto debe usar una cláusula en el En SQL para darle una lista distinta de usuario.

1

Sé que esta publicación es antigua, pero me encontré con el mismo problema y pensé que compartiría una respuesta que encontré es mucho más simple.

No importa qué: NHibernate tendrá que consultar varias filas para cada objeto principal (a menos que use un SubSelect en lugar de un Join). Debido a esto, sabemos que vamos a obtener una lista de, digamos, 500 objetos, cuando en realidad solo hay 100 objetos únicos.

Dado que estos objetos ya se han consultado y ya están en la memoria, ¿por qué no utilizar LINQ?

Basado en esta pregunta: LINQ's Distinct() on a particular property la respuesta con más + da una solución muy elocuente. Cree otra lista y haga que LINQ haga la comparación clara. Si pudiéramos hacer algo distinto en la base de datos, sería claramente la mejor opción, pero como esa no es una opción, LINQ parece ser una buena solución.

Cuestiones relacionadas