2010-09-05 10 views
5

saymak Entities kullanarak bir tablodeğeri frekans

ID|VALUE 

DEĞER Her değer sayısı sorgulayabilir nasıl 0 ile 4 arasında olası değerleri bir tam sayı alanı var mı?

İdeal olarak sonuç, her bir değerin sayımı için bir tane olmak üzere 6 elemanlı bir dizi olmalı ve sonuncusu ise toplam satır sayısıdır.

var counts = 
    from row in db.Table 
    group row by row.VALUE into rowsByValue 
    orderby rowsByValue.Key 
    select rowsByValue.Count(); 

tablodaki satır sayısını elde etmek için, birlikte sayıları tüm ekleyebilirsiniz: Burada

cevap

16

Bu basit bir program yok sadece bununla:

class Record 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Record> records = new List<Record>() 
     { 
      new Record() { Id = 1, Value = 0}, 
      new Record() { Id = 2, Value = 1 }, 
      new Record() { Id = 3, Value = 2 }, 
      new Record() { Id = 4, Value = 3 }, 
      new Record() { Id = 5, Value = 4 }, 
      new Record() { Id = 6, Value = 2 }, 
      new Record() { Id = 7, Value = 3 }, 
      new Record() { Id = 8, Value = 1 }, 
      new Record() { Id = 9, Value = 0 }, 
      new Record() { Id = 10, Value = 4 } 
     }; 

     var query = from r in records 
        group r by r.Value into g 
        select new {Count = g.Count(), Value = g.Key}; 

     foreach (var v in query) 
     { 
      Console.WriteLine("Value = {0}, Count = {1}", v.Value, v.Count); 
     } 
    } 
} 

Çıktı:

Value = 0, Count = 2 
Value = 1, Count = 2 
Value = 2, Count = 2 
Value = 3, Count = 2 
Value = 4, Count = 2 

hafifçe değiştirilmiş sürümü sadece bir Array öğesi döndürmesini değerlerin sayısı:

int[] valuesCounted = (from r in records 
         group r by r.Value 
         into g 
         select g.Count()).ToArray(); 

Satır sayımının sonuna eklenmesi:

valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray(); 
3

sırayla, VALUE her değeri için satır sayısını alacağı nasıl. Orijinal dizinin iki kez yinelenmesini istemiyorsunuz; Bu, sorgunun iki kez yürütülmesine neden olur. Bunun yerine, önce bir ara listesini yapmak gerekir:

var countsList = counts.ToList(); 

var countsWithTotal = countsList.Concat(new[] { countsList.Sum() }); 
+1

veya tüm sayıları ekleyebilir miyim? counts.Sum() kullanabilir miyim? – Rana

+0

Evet, bunu da yapabilirdiniz. Cevabımı yansıtacak şekilde düzenledim. –