我有一个类似的课程
public class Empolyee
{
public string Designation {get ;set;}
public string Discipline {get ;set;}
public int Scale {get ;set;}
public DateTime DOB {get ;set;}
public int Sales {get ;set;}
}
Run Code Online (Sandbox Code Playgroud)
并以可数的说法记录所有员工的记录
List<Employee> Employees;
Run Code Online (Sandbox Code Playgroud)
和一个字符串键列表
var Keys = new List<string>()
{
"Designation",
"Scale",
"DOB"
};
Run Code Online (Sandbox Code Playgroud)
假设列表"Keys"的元素是用户指定的,用户可以指定no或许多关键元素.
现在我想使用列表"Keys"中指定的键对所有"Employees"进行分组,并仅选择"Keys"中指定的属性以及每个组的Sales of Sum.
在我尝试使用的3个解决方案中,以下看起来适用但无法使用它,因为不知道列表"Keys"将如何转换为匿名类型
Employees.GroupBy(e => new { e.Key1, e.Key2, ... })
.Select(group => new {
Key1 = group.Key.Key1,
Key2 = group.Key.Key2,
...
TotalSales = group.Select(employee => employee.Sales).Sum()
});
Run Code Online (Sandbox Code Playgroud) 我正在处理用户可以选择他/她想要在屏幕上看到的列以及要分组或聚合的列的应用程序.因此,在我的LINQ部分中,我实际上应该将包含列名的变量传递给group by和aggregate子句.请记住,DataTable dt每次可能包含不同的数据(例如员工信息,采购订单,绩效统计等).我只能通过dt.Columns[i].ColumnName和运行时获取有关数据的信息dt.Columns[i].DataType.Name.任何人都可以建议如何做到这一点,我需要的是这样的事情:
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
var query = from row in dt.AsEnumerable()
group row by new
{
foreach(DataColumn column in dt.Columns)
{
row[column.ColumnName];
}
} into grp
select new
{
foreach(DataColumn column in dt.Columns)
{
if(column.DataType.Name == "Decimal")
{
Sum(grp[column.ColumnName]);
}else{
grp[column.ColumnName];
}
}
};
Run Code Online (Sandbox Code Playgroud) 是否有一种很好的方法可以GroupBy在运行时确定分组键的Linq ?例如,我希望从用户选择的字段列表构建分组键 - 你能这样做吗?我知道我可以很容易地做到这一点,如果我转换一切字串的表,但我想知道是否有其他方式来完成这个优雅的或聪明的办法.
class Item
{
public int A, B;
public DateTime D;
public double X, Y, Z;
}
Run Code Online (Sandbox Code Playgroud)
我List<Item>有个叫data.我想要做的事情一样检索的总和X按分组A,或的总和X,Y以及Z通过分组A和B.但是应该能够以某种方式在运行时指定哪些字段进入分组.
c# ×3
group-by ×2
linq ×2
.net ×1
aggregate ×1
asp.net-mvc ×1
dynamic-linq ×1
ienumerable ×1
lambda ×1