如何通过在C#中使用LINQ来使用group by,having和sum来返回sum值

时间:2017-03-04 20:20:33

标签: c# linq

我使用LINQ搜索使用Group By和Sum的许多主题相关但我不能在Group By,Having和Sum之间使用组合然后返回Interger。任何人都可以帮忙吗

我有一个数据表

|---------------------|------------------|
|      Name           |     Count        |
|---------------------|------------------|
|          Apple      |         34       |
|---------------------|------------------|
|          Apple      |         12       |
|---------------------|------------------|
|          Orange     |         10       |
|---------------------|------------------|

我想通过使用LINQ(Group By,Having和Sum)返回关于apple总量的整数是46

这是我的代码,但无法运行

 int total = dt.AsEnumerable().Where(tt => tt.Field<string>("Name") == "Apple")
        .GroupBy(tt => tt.Field<string>("Name"))
        .Sum(tt => Int32.Parse(tt.Field<string>("Count")))

所有代码和问题

DataTable dt = new DataTable();
        DataColumn col1 = new DataColumn("Name");
        DataColumn col2 = new DataColumn("Count");

        dt.Columns.Add(col1);
        dt.Columns.Add(col2);

        DataRow row = dt.NewRow();
        row[col1] = "Apple";
        row[col2] = 34;
        dt.Rows.Add(row);

        DataRow row1 = dt.NewRow();
        row1[col1] = "Apple";
        row1[col2] = 12;
        dt.Rows.Add(row1);

        DataRow row2 = dt.NewRow();
        row2[col1] = "Orange";
        row2[col2] = 10;
        dt.Rows.Add(row2);

        int total = dt.AsEnumerable().Where(tt => tt.Field<string>("Name") == "Apple")
             .GroupBy(tt => tt.Field<string>("Name"))
             .Sum(tt => Int32.Parse(tt.Field<string>("Count")));

错误:

  

严重级代码描述项目文件行抑制状态   错误CS1929&#39; IGrouping&#39;不包含&#39; Field&#39;的定义和最好的扩展方法重载&#39; DataRowExtensions.Field(DataRow,string)&#39;需要一个类型为&#39; DataRow&#39; WindowsFormsApplication1 c:\ users \ admin \ documents \ visual studio 2015 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs 46 Active

全心全意,

2 个答案:

答案 0 :(得分:1)

你有一个逻辑问题,这不是“无法运行”的原因。由于您只想返回苹果,因此无需分组。简单总结一下!如果您想要返回不同产品的总数,那么您必须按产品分组。

然后,您需要使用匹配表列类型的Field<T>类型参数。如果您有int表列(SQL Server或数字长访问权限),则必须使用Field<int>

int total = dt.AsEnumerable()
    .Where(row => row.Field<string>("Name") == "Apple")
    .Sum(row => row.Field<int>("Count"));

另请注意,在C#中,默认字符串比较模式区分大小写。因此,请务必使用正确的大小写列名称和过滤器值。

另请注意,GroupBy会返回IEnumerable<IGrouping<TKey, TSource>>而不是IEnumerable< TSource>!因此,您需要像这样工作:

var totals = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Name")
    .Select(g => new { Name = g.Key, Total = g.Sum(row => row.Field<int>("Count")));

IGrouping<TKey, TSource>具有Key属性并实现IEnumerable<TSource>。因此,您可以在其上应用Sum功能。

这将返回具有NameTotal属性的匿名类型的枚举。

SQL中WHERE和HAVING的区别在于分组前的WHERE和分组后的HAVING。在LINQ中,这些函数始终在Where之前或GroupBy之后应用GroupBy个函数。这意味着您可以Where使用DataRow,在GroupBy之前应用Where,或GroupBy之后IGrouping<string, DataRow>应用于Where }}秒。你甚至可以在Select之后有{{1}}(如果你没有使用LINQ-to-EF或其他LINQ to Database,即如果你没有使用O / R映射器)。 / p>

答案 1 :(得分:0)

如果Count是数字类型,则可以更容易一些(否则您可以使用 p = re.compile("\"url\":\".*\.jpeg\"") # parentheses for capture groups print p.findall(line) #

Convert.ToInt32(r["Count"])