문제
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; }
}
제휴하지 않습니다 StackOverflow