문제

Linq를 실험 중인데 그룹화를 파악하는 데 문제가 있습니다.나는 여러 튜토리얼을 겪었지만 어떤 이유로 이것을 알아낼 수 없습니다.

예를 들어, 지난 30일 동안 유형별로 각 사이트에 액세스한 총 방문자 수를 저장하는 여러 웹사이트 ID가 있는 테이블(SiteStats)이 있다고 가정해 보겠습니다.

╔════════╦═════════════╦════════╦══════╗
║ 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

누군가 내가 어디로 잘못 가고 있는지 알려주실 수 있습니까?도움을 주시면 감사하겠습니다.

도움이 되었습니까?

해결책

실제로 Thomas의 코드는 작동하지만 람다 식을 사용하는 것이 더 간결합니다.

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

중첩된 LINQ 작업 없이 Sum 확장 방법을 사용합니다.

LINQ 101 예제에 따라 - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped

다른 팁

설명하기 가장 쉬운 방법은 메모리 내 개체를 사용하여 무슨 일이 일어나고 있는지 명확하게 하는 것입니다.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; }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top