首页 > 其他分享 >利用表达式树合并对象

利用表达式树合并对象

时间:2024-03-01 14:58:22浏览次数:23  
标签:studentName 对象 合并 course score typeof var Expression 表达式

js我们常用这种写法

{...a,...b}

C#中有时候也需要这样写,比如使用EFCore查询单表,又需要从另一张表取两个字段,两张表的字段合并到一个对象里面,最后返回一个集合

典型的就是b表只存了外键人员id,需要查询a表和a表中外键对应的姓名

比如

student { studentName, sid },学生表

course { courseName, cid },课程表

score { sid , courseName,cid, score }得分表

最后要从得分表取字段返回学生每课分数

course { sid courseName,cid, score,studentName}

为了显示,这就需要再加上一个课程名

我们首先构造一个DTO继承于score,在自定义一个studentName字段

class course:score{
    public string studentName{get;set; }
}

然后用表达式树来实现{...a,...b}这个功能

            var para = Expression.Parameter(typeof(student), "input1");
            var para2 = Expression.Parameter(typeof(course), "input2");
            var properties1 = typeof(student).GetProperties();
            var properties2 = typeof(course).GetProperties().Where(r => properties1.Count(x => x.Name == r.Name) == 0);
            var bindings = properties1.Select(r => Expression.Bind(typeof(course).GetProperty(r.Name), Expression.Property(para, r)));
            var bindings2 = properties2.Select(r => Expression.Bind(typeof(course).GetProperty(r.Name), Expression.Property(para2, r)));
            //新建对象
            var newExpression = Expression.New(typeof(course));
            //初始化对象
            var memberInitExpression = Expression.MemberInit(newExpression, bindings.Union(bindings2));
            //
            var lambda = Expression.Lambda<Func<student, course, course>>(memberInitExpression, para, para2);
            var combinefunc = lambda.Compile();

我们利用linq获取的集合可能是这样的结构

rows: { scores:socre类型, studentName:string类型 }

我们在foreach中构建要返回的集合

            List<course> lst = new List<course>();
            foreach (var item in rows)
            {
                lst.Add(combinefunc(item.a, new course { item.studengName }));
            }

最终就能得到想要的集合

 

标签:studentName,对象,合并,course,score,typeof,var,Expression,表达式
From: https://www.cnblogs.com/ggtc/p/18047042

相关文章

  • 简单实现new关键字,及为什么当result为对象则返回这个对象?
    下面是一个简单的JavaScript代码示例,演示了如何手动实现new关键字的功能:functionmyNew(constructor,...args){//创建一个新对象,该对象继承自构造函数的原型varinstance=Object.create(constructor.prototype);//在新对象上调用构造函数,并传入参数var......
  • Rust的Display和ToString:将对象转换为字符串
    在写代码的时候,我们经常需要将对象输出到屏幕上,或者转换为字符串;在Python中,我们可以为类型定义魔法函数__str__,print和str()都会调用它;在C++中,我们可以为对象重载ostream&operator<<(ostream&os)函数,使用ostringstream、fstream和cout的时候会调用它。在Rust中该实现什么,想必大......
  • Java匿名内部类 labmda表达式 传统风格 对比
    传统风格classMyInvocationHandlerimplementsInvocationHandler{   @Override   publicObjectinvoke(Objectproxy,Methodmethod,Object[]handlerArgs)throwsThrowable{       if("eat".equals(method.getName())){           System......
  • 使用脚本排查出近n天表空间增长对象
    SETLINES200PAGES200COLOWNERFORA10WITHT1AS(SELECTTO_CHAR(B.BEGIN_INTERVAL_TIME,'YYYYMMDD')SNAPDATE,A.TS#,A.OBJ#,TRUNC(SUM(A.SPACE_ALLOCATED_DELTA)/1024/1024)DELTA_MBFROMDBA_HIST_SEG_STATA,......
  • 150. 逆波兰表达式求值 C
    intevalRPN(char**tokens,inttokensSize){int*stack=(int*)malloc(sizeof(int)*tokensSize);for(inti=0;i<tokensSize;i++)stack[i]=0;inttop=-1;for(inti=0;i<tokensSize;i++){if(tokens[i][0]=='+'){i......
  • jq ajax传递json对象到服务端及contentType的用法
    目录0、一般情况下,通过键值对的方式将参数传递到服务端0.1客户端代码:0.2服务端代码:0.3在浏览器的网络中查看此次请求:1、ajax传递复杂json对象到服务端1.1方法一:通过formdata传值,服务端通过key获取值;1.2方法二:通过formdata方式传值,服务端读取Request.InputStrea......
  • 数组对象删除不满足某些条件的对象 js
    recursiveFunction(items,childrenNodeName,ids){console.log('items',ids);//获取数组长度if(items)items=[];letlen=items?.length//循环遍历数组for(leti=0;i<len;i++){//如果有子节点,递归遍历......
  • 对象的使用
    既然现在我们知道如何创建对象,那么我们怎么去访问这个对象呢,比如我现在想要去查看或是修改它的名字。我们同样可以使用一个变量来指代某个对象,只不过引用类型的变量,存储的是对象的引用,而不是对象本身:publicstaticvoidmain(String[]args){//这里的a存放的是具体的某个值......
  • 面向对象—【类与对象】【类的定义与对象创建】【对象的使用】【方法创建与使用】【方
    面向对象基础篇我们在前面已经学习了面向过程编程,也可以自行编写出简单的程序了。我们接着就需要认识面向对象程序设计(ObjectOrientedProgramming)它是我们在Java语言中要学习的重要内容,面向对象也是高级语言的一大重要特性。面向对象是新手成长的一道分水岭,有的人秒懂,有的人......
  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......