小编Vag*_*Gon的帖子

使用带有动态匿名对象的 NHibernate 在 GroupBy 查询中选择

我的主要目标是创建一个动态组并在 NHibernate 中使用它。

考虑到本次非动态的例子作品

_repository.Collection<User>().GroupBy(u => new { u.Active }).Select(s => s.Key, Count = s.Count())
Run Code Online (Sandbox Code Playgroud)

现在,我创建一个动态对象来动态生成new { u.Active }零件:

    private Expression<Func<T, object>> CreateGrouping<T>(IEnumerable<string> by)
    {
        var dynamicTypeForGroup = GetDynamicTypeForGroup<T>(by);
        var sourceItem = Expression.Parameter(typeof(T));

        var bindings = dynamicTypeForGroup
            .GetFields()
            .Select(p => Expression.Bind(p, Expression.PropertyOrField(sourceItem, p.Name)))
            .Cast<MemberBinding>()
            .ToArray();
        return Expression.Lambda<Func<T, object>>(Expression.Convert(
            Expression.MemberInit(
                Expression.New(dynamicTypeForGroup.GetConstructor(Type.EmptyTypes)),
                bindings),
            dynamicTypeForGroup),
        sourceItem);
    }
Run Code Online (Sandbox Code Playgroud)

类型在方法中生成GetDynamicTypeForGroup,然后实例化Expression.MemberInit(Expression.New(dynamicTypeForGroup.GetConstructor(Type.EmptyTypes)), bindings)

这是生成类型的方式:

    private Type GetDynamicTypeForGroup<T>(IEnumerable<string> members)
    {
        var type = typeof(T);
        var dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(
            new AssemblyName(Guid.NewGuid().ToString()),
            AssemblyBuilderAccess.RunAndSave …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection nhibernate reflection.emit

3
推荐指数
1
解决办法
281
查看次数

标签 统计

.net ×1

c# ×1

nhibernate ×1

reflection ×1

reflection.emit ×1