gpt4 book ai didi

c# - 将动态匿名对象添加到 linq groupBy 表达式中

转载 作者:太空狗 更新时间:2023-10-30 01:33:05 24 4
gpt4 key购买 nike

我有以下 linq 表达式:

Func<Entity, object> groupQuery = item => 
new { a = item.Attributes["name"], item = item.Attributes["number"] };
var result = target.Collection.Entities.GroupBy(groupQuery).ToList();

但是如果我不知道我将对多少列进行分组(例如 3 个而不是 2 个),以及存储在列表名称中的属性名称,我应该如何更改我的 groupQuery 对象?我的第一个想法是创建这样的动态对象,但它不起作用

dynamic groupQuery= new ExpandoObject();
IDictionary<string, object> dictionary = (IDictionary<string, object>)groupQuery;

foreach (string str in Names)
{
dictionary.Add(str, str);
}

最佳答案

您可以返回一个字符串,而不是从 groupQuery 返回一个对象。该字符串将根据您要分组的对象的属性构建。根据配置,它可以以不同的方式生成,即基于不同的属性。这是一个显示想法的代码:

public class A
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
}

public enum GroupByuMode
{
GroupBy1,
GroupBy2,
GroupBy3,
}

...

var list = new List<A>();
for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j)
for (int k = 0; k < 10; ++k)
list.Add(new A { Property1 = i.ToString(), Property2 = j.ToString(), Property3 = k.ToString() });

var mode = GroupByuMode.GroupBy1;

Func<A, object> func = a =>
{
if (mode == GroupByuMode.GroupBy1)
return a.Property1;
else if (mode == GroupByuMode.GroupBy2)
return String.Format("{0}_{1}", a.Property1, a.Property2);
else if (mode == GroupByuMode.GroupBy3)
return String.Format("{0}_{1}_{2}", a.Property1, a.Property2, a.Property3);

return null;
};

var res = list.GroupBy(func).ToList();
Console.WriteLine(res.Count);

mode = GroupByuMode.GroupBy2;

res = list.GroupBy(func).ToList();
Console.WriteLine(res.Count);

如上所示,它适用于 LINQ to Objects。您必须检查它是否适用于 LINQ to Entities 或 LINQ 的其他实现。

关于c# - 将动态匿名对象添加到 linq groupBy 表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34918209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com