2009-11-16 5 views
6

Je suis en train d'obtenir la sortie de SQL à l'aide LINQ to NHibernate:LINQ to NHibernate: Distinct

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

Les propriétés de nom et l'année vont être enveloppé dans une nouvelle classe, de sorte que le C# code ressemblera à quelque chose comme ceci:

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

Comment puis-je obtenir le mot-clé DISTINCT à apparaître dans la requête SQL?

+0

avez-vous essayé .Sélectionnez (...). Distinct(). ToList()? –

+0

oui, il ne fait rien – cbp

+0

qu'en est-il de .Distinct(). Sélectionnez (x => nouveau Foobar (...)). ToList()? –

Répondre

1

ne peut pas votre essai:

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

Select retourne un IEnumerable, donc par défaut, il doit avoir Distinct, que votre IntelliSense détecte ou non.

+0

J'ai essayé de mettre Distinct() dans toutes les différentes positions, mais il n'a aucun effet observable. L'exécution du profileur de requête indique que le mot clé DISTINCT n'est pas ajouté à la requête sql. – cbp

1

Je n'utilise pas le fournisseur linq au jour le jour, mais regarder autour ne semble pas possible.

Pourriez-vous envisager 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>(); 

J'espère que cela aide.