Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Linq分组_C#_Linq - Fatal编程技术网

C# C Linq分组

C# C Linq分组,c#,linq,C#,Linq,我正在用Linq做实验,但我很难搞清楚分组。我已经阅读了好几篇教程,但由于某种原因,我无法理解这一点 例如,假设我有一个带有多个网站ID的SiteStats表,该表按类型存储了过去30天访问每个网站的总访客数 ╔════════╦═════════════╦════════╦══════╗ ║ SiteId ║ VisitorType ║ Last30 ║ Total║ ╠════════╬═════════════╬════════╬══════╣ ║ 1 ║ 1

我正在用Linq做实验,但我很难搞清楚分组。我已经阅读了好几篇教程,但由于某种原因,我无法理解这一点

例如,假设我有一个带有多个网站ID的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这样的东西来找回总数


有人能告诉我哪里出了问题吗?非常感谢您的帮助。

对于我来说,最简单的说明方法是使用内存中的对象,以便清楚发生了什么。LINQtoSQL应该能够接受相同的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; }
}

实际上,尽管Thomas的代码可以工作,但使用lambda表达式更简洁:

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示例-

尽管OP没有问,但您能告诉我们如何用LINQ的方法语法编写它吗?