2013-06-18 2 views
3

У меня есть ArrayList типа RawResults где RawResults является расположением и датасписок Populate с помощью LINQ

public class RawResult 
{ 
    public string location { get; set; } 
    public DateTime createDate {get; set; } 

    public RawResults(string l, DateTime d) 
    { 
     this.location = l; 
     this.createDate = d; 
    } 
} 

Я хотел бы использовать LINQ для заполнения списка, содержащего каждый отчетливого расположения и количество раз он появляется в моем архаристе. Если я в состоянии сделать это в SQL это будет выглядеть следующим образом

select 
    bw.location, 
    count(*) as Count 
from 
    bandwidth bw, 
    media_log ml 
where 
    bw.IP_SUBNET = ml.SUBNET 
    group by bw.location 
    order by location asc 

позже я также будет делать то же самое, но в пределах заданного диапазона дат.

UPDATE это запрос, который был запущен, чтобы получить все данные в rawData

SELECT   
    MEDIASTREAM.BANDWIDTH.LOCATION, MEDIASTREAM.MEDIA_LOG.CREATE_DATE 
FROM    
    MEDIASTREAM.BANDWIDTH INNER JOIN 
     MEDIASTREAM.MEDIA_LOG ON MEDIASTREAM.BANDWIDTH.IP_SUBNET =  
     MEDIASTREAM.MEDIA_LOG.SUBNET 

Теперь мне нужно запросить данные, который был возвращен в rawData, чтобы получить различные наборы результатов. У меня есть список для запроса.

+2

Прежде всего: используйте «Список ». –

+0

спасибо, я изменил тип обратно на 'Список ' – Mike

ответ

6

Вы можете сделать это:

var results = 
    (from bw in data.bandwith 
    join ml in data.media_log on bw.IP_SUBNET equals ml.SUBNET 
    group bw by bw.location into g 
    orderby g.Key 
    select new 
    { 
     location = g.Key, 
     Count = g.Count() 
    }) 
    .ToList(); 

Хотя ToList не является необходимым, если вам абсолютно необходимость не быть List<T>. Для фильтрации по времени, вы можете просто сделать что-то вроде этого:

var results = 
    (from bw in data.bandwith 
    join ml in data.media_log on bw.IP_SUBNET equals ml.SUBNET 
    where bw.createDate >= minDate && bw.createDate <= maxDate 
    group bw by bw.location into g 
    orderby g.Key 
    select new 
    { 
     location = g.Key, 
     Count = g.Count() 
    }) 
    .ToList(); 

Если media_log не имеет значения, вы можете просто опустить join:

var results = 
    from bw in data.bandwith 
    group bw by bw.location into g 
    orderby g.Key 
    select new 
    { 
     location = g.Key, 
     Count = g.Count() 
    } 

Или беглый синтаксис:

var results = data.bandwith 
    .GroupBy(bw => bw.location, (k, g) => new { location = k, Count = g.Count() }) 
    .OrderBy(r => r.location); 

Для фильтрации по дате просто используйте это:

var results = 
    from bw in data.bandwith 
    where bw.createDate >= minDate && bw.createDate <= maxDate 
    group bw by bw.location into g 
    orderby g.Key 
    select new 
    { 
     location = g.Key, 
     Count = g.Count() 
    }; 

Или беглом синтаксисом:

var results = data.bandwith 
    .Where(bw => bw.createDate >= minDate && bw.createDate <= maxDate) 
    .GroupBy(bw => bw.location, (k, g) => new { location = k, Count = g.Count() }) 
    .OrderBy(r => r.location); 

Ноут использовать ArrayList, или любой другой, не универсальный тип коллекции в запросе Linq, используйте Cast<T> или OfType<T> методы, например:

var results = bandwithArrayList 
    .Cast<RawResults>() 
    .GroupBy(bw => bw.location, (k, g) => new { location = k, Count = g.Count() }) 
    .ToList(); 
+0

Спасибо за ваш ответ, однако у меня есть только 'ArrayList rawData' для запуска LINQ. – Mike

+2

@Mike ArrayList не является общим ... –

+0

@Mike На ваш вопрос ссылается 'media_log', поэтому я предположил, что это важно. Если это совсем не актуально, вы можете просто оставить его вне запроса. См. Мой обновленный ответ. –

3
List<RawResult> results = MethodToGetResults(); 

var locationCount = results 
    .GroupBy(r => r.location) 
    .Select(lc => new {Location = lc.location, Count = lc.Count()}); 
Смежные вопросы