gpt4 book ai didi

entity-framework - 动态分组多列

转载 作者:行者123 更新时间:2023-12-03 03:30:52 34 4
gpt4 key购买 nike

有什么方法可以动态分组多列吗?

例如。 按 new { x.Column1, x.Column2 } 对 x 进行分组

但是x.Column1等我想动态设置(从UI)

最佳答案

在数据库站点上动态实现此目的的方法非常复杂,因为我们无法动态创建匿名类型。为了替换它们,我建议创建一个类:

public class CustomTuple<T1, T2>
{
public T1 Item1 { get; set; }
public T2 Item2 { get; set; }
}

我们不能在这里使用 Tuple,因为它没有默认构造函数。在 CustomTuple 类中,最多放置您需要的尽可能多的参数 T 和属性。如果您将在该类中定义 5 个属性,但对于查询,您将仅使用 3 个属性,您只需将 3 个属性设置为正确的值,其余 2 个属性保留为 null - 查询仍然有效。或者,您可以在运行时使用 CodeDOM 动态生成适当的类。然后是查询逻辑:

Type[] parameterTypes = new Type[] { typeof(int), typeof(object) };
Type tupleType = typeof(CustomTuple<,>).MakeGenericType(parameterTypes);
ParameterExpression x = Expression.Parameter(typeof(Entity));
NewExpression body = Expression.New(tupleType.GetConstructor(new Type[0]), new Expression[0]);
MemberBinding binding1 = Expression.Bind(
typeof(CustomTuple<,>).MakeGenericType(parameterTypes).GetProperty("Item1"),
Expression.Property(x, "Value"));
MemberInitExpression memberInitExpression =
Expression.MemberInit(
body,
binding1);

Expression<Func<Entity, object>> exp = Expression.Lambda<Func<Entity, object>>(memberInitExpression, x);
using (MyDbContext context = new MyDbContext())
{
var list = context.Entities.GroupBy(exp).ToList();
}

以上代码按值属性对实体进行分组。参数类型可以在程序执行期间动态构建 - 这是匿名类型的属性类型列表,用于分组依据中的键选择。在此基础上我们创建了正确的 CustomTuple 类型。然后,我们在运行时动态创建绑定(bind) 1 个元素 - 每个要为分组键设置的属性都有一个元素。在上面的示例中,我只创建了一个。通过使用 NewExpression 和 MemberBinding 表达式,我们可以使用 MemberInit 方法构建初始化表达式。最后,您可以从中构建 lambda 表达式并针对数据库执行它。

关于entity-framework - 动态分组多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906939/

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