C# Linq 关联查询 select 结果通过 反射赋值

1.因为开发中经常出现 多个list 关联查询,然后赋值新的ShowModel作为展示或其它操作使用;
2.新赋值的ShowModel 里面字段又大部分和 关联查询的list字段名称相同,但是自己又想偷懒不想 一个一个写 如下赋值方式:
select new ShowModel{ xxxx=*****,xxxxx2=****};
3.受朋友推荐的文章启发,把以前写的一个 ModelA to ModelB 的反射 改装为list 关联查询相同字段直接赋值。
点击查看参考文献

参数说明:

var _listA=new List<A>();
var _listB=new List<B>();
var _listC=new List<C>();

执行查询

备注:TShowModel 里面字段 是类A、B、C 三个组合的字段,并且名称必须相同。

例:

class A{ public int aId{get;set;}}
class TShowModel { public int aId{get;set;}}

查询语句

from a in _listA
join b in _listB on a.Id equals b.aId
join c in _listC on b.Id equals b.bId
select  Transformation<TShowModel>.LinqSelectInject(new { o, e, p }, new TShowModel());

封装方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace TOOL
{
	public class Transformation<T> where T : new()
	{
		#region Linq查询赋值
		/// <summary>
		/// Linq 查询赋值
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <typeparam name="Tn"></typeparam>
		/// <param name="oldobjmodel"></param>
		/// <param name="newobjModel"></param>
		/// <returns></returns>
		public static Tn LinqSelectInject<T, Tn>(T oldobjmodel, Tn newobjModel)
		{
		    //获取匿名对象的具体属性集合
		    var _listModelInfos = GetModelInfos(oldobjmodel);
	
		    Tn Nobjmodel = newobjModel;
		    //被继承的类
		    //Type oldmodelType = typeof(T);
		    Type newModelType = typeof(Tn);//继承后的新类
		    PropertyInfo[] newpropertys = newModelType.GetProperties();//列举出新的类中信息
		    //PropertyInfo[] oldpropertys = oldmodelType.GetProperties();//获取老的类名称
		    //循环新类的属性
		    foreach (PropertyInfo pi in newpropertys)
		    {
		        string ParaName = pi.Name;//参数名称
		                                  //判断新的Model中是否存在字段不存在老的Model中
		        object propertyValue = GetInfosValue(_listModelInfos, ParaName);
		        if (propertyValue != null)
		        {
		            string ParamType = pi.PropertyType.Name;//字段类型 int/DateTime/string 等等
		            //object vaule = modelType.GetProperty(ParaName).GetValue(objmodel, null);//从被继承的类中根据相同字段名称读取类的值
		            newModelType.GetProperty(ParaName).SetValue(Nobjmodel, propertyValue, null);//给新版本的类参数赋值
		        }
		    }
		    return Nobjmodel;
		}
		/// <summary>
		/// 解析获取匿名对象,并返回具体对象集合
		/// var o=new List<A>();
		/// var e=new List<B>();
		/// var p=new List<C>();
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <param name="oldobjmodel">值是一个匿名对象 new{o,e,p}</param>
		/// <returns></returns>
		static IEnumerable<object> GetModelInfos<T>(T oldobjmodel)
        {
            
            Type type = oldobjmodel.GetType();
            //获取到类的所有成员变量信息
            PropertyInfo[] infos = type.GetProperties();

            return infos.Select(it => it.GetValue(oldobjmodel));
            /*
             * 中间注释内容用来测试 模拟读取数据的
            //分解匿名对象获取的具体对象,并拼接存放一起作为对象集合
            var _listModelInfos = new List<object>();
            foreach (PropertyInfo info in infos)
            {
                //属性为 Model.A
                string propertyModelType = info.PropertyType.ToString();
                // 名称为 o
                string propertyModelName = info.Name;
                //此时获取的值仅仅只是 类的值,而不是 类里面的字段属性值
                object propertyModelValue = info.GetValue(oldobjmodel);
                中间注释内容用来测试 模拟读取数据的
                获取对象的类型
                //var testGetType = propertyModelValue.GetType();
                获取对象集合
                //var testInfo = testGetType.GetProperties();
                此时获取的才是对应字段的值
                //var testValue = testInfo.Where(it => it.Name == "ExamOrderNumber").Select(it => it.GetValue(propertyModelValue)).FirstOrDefault();
                
                _listModelInfos.Add(propertyModelValue);
            }
            return _listModelInfos;
            */
        }
        /// <summary>
        /// 获取 对象的值
        /// </summary>
        /// <param name="_listModelInfos"></param>
        /// <param name="paraName"></param>
        /// <returns></returns>
        static object GetInfosValue(IEnumerable<object> _listModelInfos, string paraName)
        {
            object propertyValue = null;
            foreach (var item in _listModelInfos)
            {
                propertyValue = item.GetType().GetProperties().Where(it => it.Name == paraName).Select(it => it.GetValue(item)).FirstOrDefault();
                if (propertyValue != null)
                    break;
            }
            return propertyValue;
        }
		#endregion
	}
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值