2009-11-16 20 views
6

Estoy tratando de obtener la siguiente salida de SQL utilizando LINQ to NHibernate:LINQ to NHibernate: Toda la

SELECT DISTINCT Name, at.Year FROM MyTable mt 
INNER JOIN AnotherTable at ON at.Id = mt.AnotherTableId 

el nombre y el año van a ser envuelto en una nueva clase, por lo que el C# código será algo como esto:

Session.Linq() 
    .Select(x => new FooBar { Name = x.Name, Year = x.AnotherTable.Year })) 
    .ToList(); 

¿Cómo puedo obtener la palabra clave DISTINCT a aparecer en la consulta SQL?

+0

intenté .Seleccionar (...). Distinto(). ToList()? –

+0

sí, no hace nada – cbp

+0

¿Qué tal .Distinct(). Seleccione (x => new Foobar (...)). ToList()? –

Respuesta

1

No Puede su intento:

Session.Linq() 
    .Select(x => new FooBar { Name = x.Name, Year = x.Year })) 
    .Distinct() 
    .ToList(); 

Select devuelve un IEnumerable, lo que por defecto se debe tiene Distinct, independientemente de si su intelisense detecta o no.

+0

He intentado poner Distinct() en todas las diferentes posiciones, pero no tiene ningún efecto observable. La ejecución del generador de consultas muestra que la palabra clave DISTINCT no se está agregando a la consulta SQL. – cbp

1

No utilizo el proveedor de linq día a día, pero mirando alrededor no parece posible.

¿Podría considerar QueryOver?

First firstReference = null; 
     Second secondReference = null; 
     var items = Session().QueryOver(() => firstReference) 
         .JoinAlias(() => firstReference.Seconds,() => secondReference) 
         .Select(Projections.Distinct(
           Projections.ProjectionList() 
            .Add(Projections.Property(() => firstReference.Name).WithAlias(() => firstReference.Name)) 
            .Add(Projections.Property(() => secondReference.Year).WithAlias(() => secondReference.Year)))) 
         .TransformUsing(Transformers.AliasToBean(typeof(FooBar))) 
         .List<FooBar>(); 

Espero que esto ayude.