gpt4 book ai didi

C# 动态创建 Lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 14:21:49 26 4
gpt4 key购买 nike


我使用 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<Page> GetPage(IDbConnection dbConnection, string sql)
{
return (List<Page>)dbConnection.Query<Page, User, Page>(sql,
(Page p, User u) =>
{
p.UserCreatedPage = u;
return p;
},
splitOn: "IdUser").ToList();
}

现在,我想要的是动态创建 Func<TFirst, TSecond, TOut>我需要映射对象。
有人能帮我吗?非常感谢。

附言我知道在这种情况下动态创建它没有意义,但这只是所有自动映射项目的一个简单版本。

最佳答案

解决方案

我终于找到了做我想做的事的方法。
这是生成 Func<TFirst, TSecond, TOut> 的函数代码:

public static Func<TFirst, TSecond, TFirst> MappingDynamicFunc<TFirst, TSecond>()
{
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<Func<TFirst, TSecond, TFirst>>(block, new ParameterExpression[] { paramFirst, paramSecond }).Compile();
}

这是“GetPage”方法:

public List<Page> GetPage(IDbConnection dbConnection, string sql)
{
return (List<Page>)dbConnection.Query<Page, User, Page>(sql,
MappingDynamicFunc<Page, User>(),
splitOn: "IdUser").ToList();
}

关于C# 动态创建 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736920/

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