我使用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
全心全意,
答案 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
功能。
这将返回具有Name
和Total
属性的匿名类型的枚举。
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"])