2008-12-21 12 views
5

bir gruplandırma var mı o yıl içinde parçalanmış öğeleri ve o yıl içinde bir miktar ürün aldım. (yani 2001 - 10, 1975 - 15, 2005 - 5, 1976 - 1) Gerçekten yapmak istediğim şey onları on yıl içinde kırmaktır (yani 2000'ler - 15, 1970'ler - 16).nasıl ben EF LINQ kullanarak ve aşağıdaki LINQ sorgusu var am a "hesaplanan alan"

Bir Linq ifadesi için grup tümcesinin "by" kısmındaki "hesaplanan alan" a nasıl sahip olur. Ben tarafından grup yapmak için biraz daha karmaşık bir değerlendirme/hesaplama yapmak, böylece daha genel

var results = (from x in ctx.Items 
       group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades 
       orderby decades.Count() descending 
       select new { Decade = decades.Key, DecadeCount = decades.Count() }); 

Veya sözdizimi: Ne istediğinizi temelde gibi bir şey olduğunu düşünüyorum. Herhangi bir fikir?

DÜZENLEME (güncelleme):

(. X => x.Year.Value.ToString() Alt dize (0, 3) + "0") - İş yapmaz - "varlıkları için LINQ değil 'System.String ToString()' yöntemini tanır ve bu yöntem bir mağaza ifadesine dönüştürülemez. "

(x.Year/10 * 10) - Fonksiyonel (teşekkür ederim) işleri - Sadece ""

mi (yani 1970 vs 1970) 'ın' ucunda olmadığı yoktur Her neyse, bir yan tümcesine bir işlev koymak için? yani, x ile bu gruba x.Yıldır (x.Year) ... ya da ... x => x.Year.Value.ToString() Substring (0,3) + "0s"? Düşünebildiğim herhangi bir vakayı ele alabilmem için bazı tekniklere (bir işlevi çağırmak veya bir lambda ifadesi kullanmak gibi) sahip olmak güzel olurdu.

Bu konudaki herkesin yardımları için tekrar teşekkürler.

cevap

2

bir gruplandırma yapmak ya seçmek ya da tüzel kısmi sınıflarında definied edilir hesaplanan alanlar üzerinde benzer olamaz gibi görünüyor çerçeve. (IGrouping IEnumberable uzanır gibi)

hesaplanan alanlar

nesnelere LINQ kullanılabilir

0

Seçtiğiniz sonucun sonuna SelectMany yöntemini zincirlediğinize inanıyorum. Bu IEnumerables IEnumerable döndürür.

+1

Hayır, bir gruplandırma zaten IEnumerables bir IEnumerable (böylece nesneler olarak tüm verileri geri dönebilirler ve daha sonra bir gruplandırılan). Burada SelectMany için gerek yok. –

6

x.Year/10'a göre gruplama hakkında ne dersiniz? (Bu test etmedim!)

var results = (from x in ctx.Items 
       group x by (x.Year/10 * 10) into decades 
       orderby decades.Count() descending 
       select new { Decade = decades.Key, DecadeCount = decades.Count() }); 

Edit1: Değiştirilen (x.Year/10) (x.Year/10 * 10) almak için, örneğin, 1980 yerine 198

için EDIT2: Örneğinizde, x.Year.Value.ToString() x ile grup x (Substring (0, 3) + "0s") onlarca yıl çalışmalıdır. Lamba sentaksına gerek yok.

EDIT3: Ekstra kaldırıldı * 10. Teşekkürler Marc!

+0

LINQ'dan Nesnelere, iyi olması gerekir. EF ile, aritmetiğin nasıl hesaplandığını (int/float/etc) iki kez kontrol etmeniz gerekir. Matematik isteyebilirsin.Örneğin, katın (x.Year/10) * 10', EF'in 'Math.Floor''u TSQL'in 'FLOOR' ile eşleştirebileceğini varsayarsak. –

+0

Oh, .ToString() çalışmıyor (SQL tipi hata eşleyemezsiniz) –

+0

* 10 kez (bir kez 'grup adı' içinde, bir kez de' new' seçin) sahip olabilir - ı değil ettik "matematik" çözümünü test ettim ama bu durumu çözebilir gibi görünüyor. Tüm durumlar için (örneğin, matematik tipi bir çözümü olmayan veya bir dizi ifade veya benzerleri olanlar) nasıl yapılacağını öğrenmek istiyorum. – ChrisHDog

7

Sen yıllardır birçok kez sayılmasını önlemek için let maddesini kullanabilirsiniz:

from x in ctx.Items 
group x by (x.Year/10 * 10) into decades 
let decadeCount = decades.Count() 
orderby decadeCount descending 
select new { Decade = decades.Key, DecadeCount = decadeCount } 
+0

İyi nokta. LINQ ile SQL arasında bir fark yaratmayacaktır, ancak kesinlikle LINQ'dan Objects'e ekstra bir Count() getirecektir. – Lucas