C # Linq Grouping - PullRequest
       32

C # Linq Grouping

18 голосов
/ 29 августа 2008

Я экспериментирую с Linq и у меня возникают проблемы с определением группировки. Я прошел несколько уроков, но по какой-то причине не могу понять это.

В качестве примера, скажем, у меня есть таблица (SiteStats) с несколькими идентификаторами веб-сайтов, в которой хранится подсчет количества посетителей по типам, которые обращались к каждому сайту в целом и за последние 30 дней.

╔════════╦═════════════╦════════╦══════╗
║ SiteId ║ VisitorType ║ Last30 ║ Total║
╠════════╬═════════════╬════════╬══════╣
║      1 ║           1 ║     10 ║  100 ║
║      1 ║           2 ║     40 ║  140 ║
║      2 ║           1 ║     20 ║  180 ║
╚════════╩═════════════╩════════╩══════╝

В SQL я легко могу получить счет для SiteID 1 с помощью следующего:

SELECT SiteId,  
       SUM(Last30) AS Last30Sum  
FROM Sites  
WHERE SiteId = 1  
GROUP BY SiteId

и должен получить строку, как ...

╔════════╦════════════╗
║ SiteId ║ Last30Total║
╠════════╬════════════╣
║      1 ║         50 ║
╚════════╩════════════╝

Однако я не уверен, как получить этот результат, используя Linq. Я пробовал:

var statsRecord = from ss in db.SiteStats  
    where ss.SiteId == siteId  
    group ss by ss.SiteId into ss  
    select ss;

но я не могу получить общее с чем-то вроде statsRecord.Last30

Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так? Любая помощь приветствуется.

Ответы [ 2 ]

34 голосов
/ 31 августа 2008

На самом деле, хотя код Томаса будет работать, более логично использовать лямбда-выражение:

var totals =
from s in sites
group s by s.SiteID into grouped
select new
{
    SiteID = grouped.Key,
    Last30Sum = grouped.Sum( s => s.Last30 )
};

, который использует метод расширения Sum без необходимости в вложенной операции LINQ.

в соответствии с примерами LINQ 101 - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped

4 голосов
/ 29 августа 2008

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

public class Site
{
    static void Main()
    {
        List<Site> sites = new List<Site>()
        {
            new Site() { SiteID = 1, VisitorType = 1, Last30 = 10, Total = 100, },
            new Site() { SiteID = 1, VisitorType = 2, Last30 = 40, Total = 140, },
            new Site() { SiteID = 2, VisitorType = 1, Last30 = 20, Total = 180, },
        };

        var totals =
            from s in sites
            group s by s.SiteID into grouped
            select new
            {
                SiteID = grouped.Key,
                Last30Sum = 
                    (from value in grouped
                     select value.Last30).Sum(),
            };

        foreach (var total in totals)
        {
            Console.WriteLine("Site: {0}, Last30Sum: {1}", total.SiteID, total.Last30Sum);
        }
    }

    public int SiteID { get; set; }
    public int VisitorType { get; set; }
    public int Last30 { get; set; }
    public int Total { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...