作者:Pisces2lemon | 来源:互联网 | 2022-12-02 16:33
我与Dapper一起工作,我尝试为内部联接创建自动映射的方法。
这是模型的示例:
public class User
{
public long IdUser { get; set; }
public string Email { get; set; }
}
public class Page
{
public long Id { get; set; }
public string Name { get; set; }
public long IdUserCreatedPage { get; set; }
public User UserCreatedPage { get; set; }
}
这是查询:
SELECT * FROM "PAGE" INNER JOIN "USER" ON "PAGE"."IdUserCreatedPage" = "USER"."IdUser"
如果我手动编写代码,我会这样写:
public List GetPage(IDbConnection dbConnection, string sql)
{
return (List)dbConnection.Query(sql,
(Page p, User u) =>
{
p.UserCreatedPage = u;
return p;
},
splitOn: "IdUser").ToList();
}
现在,我想要的是动态创建Func
映射对象所需的对象。
有人能帮我吗?非常感谢你。
PS我知道在这种情况下,动态创建它是没有意义的,但这只是所有自动映射项目的简单版本。
1> Fabrizio Pai..:
解
最终,我找到了做自己想要的方法。
这是Generate函数的代码Func
:
public static Func MappingDynamicFunc()
{
ParameterExpression paramFirst = Expression.Parameter(typeof(TFirst), "paramFirst");
ParameterExpression paramSecOnd= Expression.Parameter(typeof(TSecond), "paramSecond");
MemberExpression memberExpression = Expression.PropertyOrField(paramFirst, "UserCreatedPage");
BinaryExpression assign = Expression.Assign(memberExpression, paramSecond);
LabelTarget labelTarget = Expression.Label(typeof(TFirst));
GotoExpression returnExpression = Expression.Return(labelTarget, paramFirst, typeof(TFirst));
LabelExpression labelExpression = Expression.Label(labelTarget, Expression.Default(typeof(TFirst)));
BlockExpression block = Expression.Block(
assign,
returnExpression,
labelExpression
);
return Expression.Lambda>(block, new ParameterExpression[] { paramFirst, paramSecond }).Compile();
}
这是“ GetPage”方法:
public List GetPage(IDbConnection dbConnection, string sql)
{
return (List)dbConnection.Query(sql,
MappingDynamicFunc(),
splitOn: "IdUser").ToList();
}