C# 如何在C中使用group by、having和sum by LINQ返回sum值#

C# 如何在C中使用group by、having和sum by LINQ返回sum值#,c#,linq,C#,Linq,我使用Group By和Sum By LINQ搜索了许多相关主题,但我不能在Group By、Having和Sum之间使用combo,然后返回INTEGER。有人能帮忙吗 我有一个数据表 |---------------------|------------------| | Name | Count | |---------------------|------------------| | Apple |

我使用Group By和Sum By LINQ搜索了许多相关主题,但我不能在Group By、Having和Sum之间使用combo,然后返回INTEGER。有人能帮忙吗

我有一个数据表

|---------------------|------------------|
|      Name           |     Count        |
|---------------------|------------------|
|          Apple      |         34       |
|---------------------|------------------|
|          Apple      |         12       |
|---------------------|------------------|
|          Orange     |         10       |
|---------------------|------------------|
我想用LINQ(Group by、Having和Sum)返回关于苹果总量为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")))
int total=dt.AsEnumerable()。其中(tt=>tt.Field(“Name”)==“Apple”)
.GroupBy(tt=>tt.Field(“名称”))
.Sum(tt=>Int32.Parse(tt.Field(“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")));
DataTable dt=newdatatable();
DataColumn col1=新的DataColumn(“名称”);
DataColumn col2=新的DataColumn(“计数”);
dt.Columns.Add(col1);
dt.Columns.Add(col2);
DataRow row=dt.NewRow();
行[col1]=“苹果”;
行[col2]=34;
dt.行。添加(行);
DataRow row1=dt.NewRow();
行1[col1]=“苹果”;
行1[col2]=12;
dt.行。添加(第1行);
DataRow row2=dt.NewRow();
第2行[col1]=“橙色”;
row2[col2]=10;
dt.行。添加(第2行);
int total=dt.AsEnumerable()。其中(tt=>tt.Field(“Name”)==“Apple”)
.GroupBy(tt=>tt.Field(“名称”))
.Sum(tt=>Int32.Parse(tt.Field(“Count”));
错误:

严重性代码说明项目文件行抑制状态 错误CS1929“iGroup”不包含“Field”的定义,最佳扩展方法重载“DataRowExtensions.Field(DataRow,string)”需要“DataRow”WindowsFormsApplication1类型的接收器c:\users\admin\documents\visual studio 2015\Project\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 46 Active


谢谢大家,

您有一个逻辑问题,这不是“无法运行”的原因。因为你只想还苹果,所以没有必要分组。简单总结一下!如果要返回不同产品的总计数,则必须按产品分组

然后您需要使用一个类型参数来
字段
,该参数与表列的类型匹配。如果有
int
表列(SQL Server或数字长访问),则必须使用
字段

int total=dt.AsEnumerable()
.Where(row=>row.Field(“名称”)==“苹果”)
.Sum(行=>行字段(“计数”);
还要注意,在C#中,默认的字符串比较模式是区分大小写的。因此,请确保列名和筛选器值大小写正确


还要注意,GroupBy返回的是
IEnumerable
,而不是
IEnumerable
!因此,您需要像这样工作:

var totals = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Name")
    .Select(g => new { Name = g.Key, Total = g.Sum(row => row.Field<int>("Count")));
var totals=dt.AsEnumerable()
.GroupBy(行=>row.Field(“名称”)
.Select(g=>new{Name=g.Key,Total=g.Sum(row=>row.Field(“Count”));
i分组
具有一个
属性,并实现了一个
IEnumerable
。因此,您可以对其应用
Sum
函数

这将返回具有
名称
总计
属性的匿名类型的枚举


SQL中WHERE和HAVING的区别在于WHERE是在分组之前执行的,HAVING是在分组之后执行的。在LINQ中,这些函数总是在
GroupBy
之前或
GroupBy
之后应用的
WHERE
函数。这意味着您可以在之前在
DataRow
上应用一个
WHERE
e> GroupBy,或
GroupBy
之后的
Where
应用于
i分组
s。您甚至可以在
选择
之后有一个
Where
(如果您没有使用LINQ to EF或其他LINQ to数据库,例如,如果您没有使用O/R映射器)。

如果计数是数字类型,则会更容易一些(否则您可以使用
Convert.ToInt32(r[“Count”])

DataTable dt=newdatatable();
默认情况下,dt.Columns.Add(“Name”);//typeof(string)
dt.Columns.Add(“Count”,typeof(int));//指定数字类型
添加(“苹果”,34);
添加(“苹果”,12);
dt.行。添加(“橙色”,10);
//要仅对Apple的计数求和,请执行以下操作:
int applecoount=dt.Rows.Cast().Sum(r=>Apple.Equals(r[0])?(int)r[1]:0);
//或按名称分组(如果需要多个名称的计数)
var lookup=dt.Rows.Cast().ToLookup(r=>r[0]作为字符串,r=>(int)r[1]);
int iAppleCount=lookup[“Apple”].Sum();//46
int iOrangeCount=查找[“橙色”].Sum();//10
//如果Count是数值tupe,也可以这样计算:
var oAppleCount=dt.Compute(“总和(计数)”,“名称='Apple'”;//46(对象{long})

在你有另一篇你认为需要删除的被否决的帖子之前,你应该先阅读并接受。我很抱歉:(格式不是主要问题。阅读并接受:这表明不费吹灰之力“无法运行”意味着什么。你是否遇到编译器错误(哪一个?)或运行时异常(哪一个?)或者只是没有得到预期的结果?count真的是一个字符串吗?你的意思是如果返回一个新的数据表,我应该使用Group By、Having和Sum吗?那么你能给我一个在LINQ中使用Group By、Having和Sum的例子吗?顺便说一句,区分大小写与.NET中的默认字符串比较无关。列名没有匹配大小写,但列索引查找在匹配时更快。我指的是C#中的默认字符串比较模式,例如,与VBA相比,其中字符串比较默认不区分大小写。但在VB和VBA中默认也区分大小写。好吧,C#和VB.Net中的字符串比较使用相同的
System.string.Equals(String,String)
方法,当您检查生成的IL时。是的,VB.NET;但是,VBA是Visual Basic 6.0 for applications,与.NETso无关。如何在许多条件下使用代码,例如名称为apple,createdate>2016@Kien答案将取决于太多的人
var totals = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Name")
    .Select(g => new { Name = g.Key, Total = g.Sum(row => row.Field<int>("Count")));
DataTable dt = new DataTable();
dt.Columns.Add("Name");                 // typeof(string) by default
dt.Columns.Add("Count", typeof(int));   // specify numeric type
dt.Rows.Add("Apple", 34);
dt.Rows.Add("Apple", 12);
dt.Rows.Add("Orange", 10);

// to sum the Count only for Apple:
int AppleCount = dt.Rows.Cast<DataRow>().Sum(r => "Apple".Equals(r[0]) ? (int)r[1] : 0); 

// or group by Name if you need the Count of more than one Name
var lookup = dt.Rows.Cast<DataRow>().ToLookup(r => r[0] as string, r => (int)r[1]);
int iAppleCount = lookup["Apple"].Sum();    // 46
int iOrangeCount = lookup["Orange"].Sum();  // 10

// if Count is numeric tupe, you can also Compute them like this:
var oAppleCount = dt.Compute("Sum(Count)", "Name = 'Apple'"); // 46 (object {long})