当前位置: 首页 > 编程语言 > C#

C#LINQ-HowtoDynamicallyBuildaGroupByClauseShare

时间:2023-04-10 14:19:37 C#

to和要分组或聚合的列。所以在我的LINQ部分,我实际上应该将包含列名的变量传递给groupby和aggregate子句。请记住,DataTabledt每次可能包含不同的数据(例如员工信息、采购订单、绩效统计等)。我只能通过dt.Columns[i].ColumnName和dt.Columns[i].DataType.Name在运行时获取有关数据的信息。谁能建议如何做到这一点,我需要的是这样的:SqlDataAdapterda=newSqlDataAdapter(cmd);DataTabledt=newDataTable();da.Fill(dt);varquery=fromrowindt.AsEnumerable()grouprowbynew{foreach(DataColumncolumnindt.Columns){row[column.ColumnName];}}intogrpselectnew{foreach(DataColumncolumnindt.Columns){if(column.DataType.Name=="Decimal"){Sum(grp[column.ColumnName]);}else{grp[column.ColumnName];}}};做这件事有很多种方法。这是一个。下面是我经常使用的一个名为NTuple的类。它与.NET框架自带的Tuple、Tuple等是同一个类。然而,NTuple类被设计用来容纳可变数量的项目。如果两个NTuple实例包含相同数量的值并且那些值相等,则它们是相等的。给定一组//根据OP,将在运行时生成要分组的列列表IEnumerablecolumnsToGroupBy=...;您可以使用NTuple类按这样的列进行分组:vargroups=dt.AsEnumerable().GroupBy(r=>newNTuple(fromcolumnincolumnsToGroupByselectr[column]));这是牛肉:publicclassNTuple:IEquatable>{publicNTuple(IEnumerablevalues){Values=values.ToArray();}publicreadonlyT[]值;publicoverrideboolEquals(objectobj){if(ReferenceEquals(this,obj))返回真;如果(obj==null)返回false;返回等于(obj作为NTuple);}publicboolEquals(NTupleother){if(ReferenceEquals(this,other))returntrue;如果(其他==null)返回false;varlength=Values.Length;如果(长度!=other.Values.Length)返回false;for(vari=0;i这是一个测试用例:staticvoidMain(string[]args){//一些示例数据vardt=newDataTable();dt.Columns.Add("NAME",typeof(string));dt.Columns.Add("城市",typeof(字符串));dt.Columns.Add("州",typeof(字符串));dt.Columns.Add("VALUE",typeof(double));dt.Rows.Add("Mike","Tallahassee","FL",3);dt.Rows.Add("Mike","Tallahassee","FL",6);dt.Rows.Add("Steve","Tallahassee","FL",5);dt.Rows.Add("Steve","Tallahassee","FL",10);dt.Rows.Add("Steve","Orlando","FL",7);dt.Rows.Add("Steve","Orlando","FL",14);dt.Rows.Add("Mike","Orlando","NY",11);dt.Rows.Add("迈克","奥兰多","纽约",22);//一些“配置”数据IEnumerablecolumnsToGroupBy=new[]{"CITY","STATE"};字符串columnToAggregate="VALUE";//测试程序foreach(vargroupindt.AsEnumerable().GroupBy(r=>newNTuple(fromcolumnincolumnsToGroupByselectr[column]))){foreach(varkeyValueingroup.Key.Values){Debug.Write(键值);Debug.Write(':');}Debug.WriteLine(group.Sum(r=>Convert.ToDouble(r[columnToAggregate])));解决方案是使用我的组件AdaptiveLINQ提供的QueryByCube函数来简单地使用反射构建一个Select表达式。此表达式由AdaptiveLINQ自动转换为使用GroupBy运算符的请求。以上就是C#学习教程:C#LINQ-HowtodynamicbuildtheGroupByclause分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处: