2011-11-04 25 views
5

Bir ReleaseDate özelliğine sahip bir yayın kümesi var. Bir pagination widget'ı yaratmak amacıyla bu setten tüm farklı yılın & -month kombinasyonlarını almak istiyorum.Linq (varlıklara) ile belirgin yıl-aylar

IEnumerable<DateTime> DistinctYearMonths = from p in context.Publications. .... ? 

Nasıl bu linq-to-kuruluşlar sorgu tamamlanabilir:

Tercihen, benim yayınlar set itibaren her farklı yıl ay için 1 olarak gün DateTime değerler listesi istiyorum?

cevap

12
IEnumerable<DateTime> DistinctYearMonths = context.Publications 
    .Select(p => new { p.ReleaseDate.Year, p.ReleaseDate.Month }) 
    .Distinct() 
    .ToList() // excutes query 
    .Select(x => new DateTime(x.Year, x.Month, 1)); // copy anonymous objects 
                // into DateTime in memory 

ara adım gereklidir (parametrelerle kurucular LıNQ varlıkları içinde projeksiyonlar desteklenmez ve DateTime ait Year ve Month özellikleri salt okunur, Böylece bunları başlatıcı sözdizimi ile ayarlayamazsınız (new DateTime { Year = p.ReleaseDate.Year, ... } mümkün değildir)).

+0

Kazandınız. Ve iyi bir açıklama için +1 - burada tüm diğer cevaplar "System.NotSupportedException" değerini vermek için benzerdir: Yalnızca parametreli olmayan kurucular ve başlatıcılar LINQ ile Varlıklar arasında desteklenir. " – Faust

2

aşağıdaki sorguyu deneyin:

(from p in publications 
select new DateTime(p.ReleaseDate.Year, p.ReleaseDate.Month, 1)).Distinct(); 
+0

Hmmm. "System.NotSupportedException" alıyorum: Yalnızca LINQ'ta Varlıklar için parametreli kurucular ve başlatıcılar destekleniyor. " Bunu doğruca LinqPad'a koyduğumda - bu konuda herhangi bir fikrin var mı? – Faust

+0

FWIW bu benim için iyi çalışıyor LinqPad –

+0

@Faust, 'ReleaseDate' özelliği başlangıçta kendiliğinden başlatılmadı demektir. DateTime ve List türünde POCO özelliklerinizi başlatmak için iyi bir uygulamadır: "public virtual List Followers {get; set; } = yeni Liste (); 've' genel sanal DateTime CreatedDate {get; set; } = DateTime.UtcNow; – Korayem

0
var DistinctYearMonths = (from p in context.Publications 
          select new DateTime(p.ReleaseDate.Year, 
               p.ReleaseDate.Month, 
               1)).Distinct(); 
1

GROUP BY kullanarak:

(from i in context.Publications 
group i by new { i.ReleaseDate.Year, i.ReleaseDate.Month } into g 
select g.Key).ToList().Select(i => new DateTime(i.Year, i.Month, 1)); 
0
var DistinctYearMonths = context.Publications 
    .Select(x => new DateTime(x.ReleaseDate.Year, x.ReleaseDate.Month, 1)) 
    .Distinct() 
    .ToList() 

Ben uzun biçimde çok daha iyi zincirleme linq yöntemleri gibi. IMO'yu okumak çok daha kolay. Doğrudan bir DateTime projeksiyon yapamazsınız çünkü anonim bir türü içine yansıtmak için

İlgili konular