热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#动态创建Lambda表达式

如何解决《C#动态创建Lambda表达式》经验,为你挑选了1个好方法。


我与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();  
}


推荐阅读
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 本文整理了Java中org.apache.activemq.util.ByteArrayInputStream.<init>()方法的一些代码示例,展示了 ... [详细]
  • TransactSQL复制字符串(SQL Server ):补足0或者其他字符串
    REPLICATE微软TechNET解释(https:technet.microsoft.comzh-cnlibraryms174383(vsql.110).aspx)REPLIC ... [详细]
  • Ifoundthiskindofexpressionseveraltimesinapythonprogram:我在python程序中多次发现这种表达式:ifvariabl ... [详细]
  • MSSQL1.SUBSTRING返回字符、binary、text或image表达式的一部分。有关可与该函数一起使用的有效Microsoft?SQLServer?数据类型的更多信息, ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • <ItemTemplate><ahref#onclickjavascript:window.location.hrefoa_NoReply.aspx?fid ... [详细]
author-avatar
Pisces2lemon
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有