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
}
}