c# - "select"实体在运行时包含导航属性

标签 c# entity-framework-core

有代码,运行时选择实体

Repository.GetAll().Select(Projection<Handbook, HandbookViewModel>())

public Expression<Func<T, D>> Projection<T, D>()
    {
        var baseParameter = Expression.Parameter(typeof(T), "base");
        var resultParameter = Expression.Parameter(typeof(D), "result");

        var bindings = typeof(D).GetProperties().Select(x => x.Name)
            .Select(name => new KeyValuePair<System.Reflection.MemberInfo, MemberExpression>(Expression.Property(resultParameter, name).Member, Expression.Property(baseParameter, name)))
            .Select(member => Expression.Bind(member.Key, member.Value));

        return Expression.Lambda<Func<T, D>>(Expression.MemberInit(Expression.New(typeof(D)), bindings), baseParameter);
    }

是否可以从具有一对一关系的导航属性中获取数据,例如 base.CreatedUser.Name?

最佳答案

var baseParameter = Expression.Parameter(typeof(T), "base");
        var resultParameter = Expression.Parameter(typeof(D), "result");

        var bindings = typeof(D).GetProperties().Select(x =>
                                                {
                                                    var attr = x.GetCustomAttribute<AtpPropertyInfoAttribute>();

                                                    var entityProperties = attr != null && !string.IsNullOrEmpty(attr.EntityProperty) ? attr.EntityProperty.Split('.') : new string[] { x.Name };

                                                    Expression entityProperty = Expression.Property(baseParameter, entityProperties[0]);
                                                    for (int i = 1; i < entityProperties.Length; i++)
                                                    {
                                                        entityProperty = Expression.Property(entityProperty, entityProperties[i]);
                                                    }
                                                    return Expression.Bind(Expression.Property(resultParameter, x.Name).Member, entityProperty);
                                                });

        return Expression.Lambda<Func<T, D>>(Expression.MemberInit(Expression.New(typeof(D)), bindings), baseParameter);

关于c# - "select"实体在运行时包含导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667770/

相关文章:

c# - Entity Framework 核心 : Violation of PRIMARY KEY constraint Cannot insert duplicate key in object

c# - 将 MDF 与 Entity Framework 核心结合使用

c# - 从我的服务器下载 zip 文件时遇到问题

c# - Dapper Reader 处置异常

c# - .Net Core HttpClient - 类型化客户端生命周期

asp.net-mvc - ASP.NET MVC6中的 Entity Framework 7对同一个表的多个外键

c# - 如何从代码应用部分迁移?

asp.net-core-mvc - MVC 6 EF7 RC1 创建多个 dbcontext

javascript - 从 highcharts 中删除周末

c# - 在 Linq to Sql 中使用排序规则