2009-11-16 13 views
6

kullanıyorum aşağıdaki SQL çıkışını almak çalışıyorum Linq NHibernate:Linq: Farklı

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

adı ve Yıl özellikleri yeni sınıfta sarılmış olacak, bu yüzden C# kod şöyle görünür:

sql sorgusunda görünmesini DISTINCT anahtar sözcüğünü nasıl alabilirim
Session.Linq() 
    .Select(x => new FooBar { Name = x.Name, Year = x.AnotherTable.Year })) 
    .ToList(); 

? varsayılan olarak gerektiği olursa olsun intellisense bunu algılar veya olmasın bakılmaksızın, Distinct zorunda,

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

Select bir IEnumerable verir:

+0

Denediniz .Select (...) Distinct() ToList()? –

+0

evet, – cbp

+0

hiçbir şey yapmaz .Distinct() 'ı seçin. (X => new Foobar (...)) ToList()? –

cevap

1

senin denemeyeceğim Can.

+0

için Distinct() öğesini farklı konumlara koymaya çalıştım ancak gözlemlenebilir bir etkisi yok. Çalışan sorgu profiler, DISTINCT anahtar kelimenin sql sorgusuna eklenmediğini gösterir. – cbp

1

Linq sağlayıcısını günden güne kullanmıyorum, ancak etrafa bakmak mümkün görünmüyor.

QueryOver'ı düşünür müsünüz?

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

Umarım bu yardımcı olur.