C# 根据前台传入实体名称,动态查询数据
前言:
项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser
1、获取实体类型
var entityType=Assembly.Load("XXX.Entity").GetTypes().Any(a =>a.Name == entityName).FirstOrDefault().FullName;
如果需要加载多个类库(以下是其中一种方式)
1、先获取DBContext里面的对象来匹配实体名称得到他的命名空间
var name = DBContext.Model.GetEntityTypes().Where(a => a.ClrType.Name == "传入的实体名称").Select(a => a.ClrType.Namespace).FirstOrDefault();
2、根据命名空间匹配到程序集
var assemblyName = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains(name)).Select(a => a.FullName).FirstOrDefault();
3、获取实体类型
var entityType = Assembly.Load(assemblyName).GetTypes().Where(a => a.Name == "传入的实体名称").FirstOrDefault();
2、创建动态仓储
var repositoryType = typeof(Repository<>).MakeGenericType(entityType);//Repository<> 一般项目会封装仓储层放一些CRUD的公共方法
var repository = Activator.CreateInstance(repositoryType, DBContext);
var queryMethod = repositoryType.GetMethod("GetList"); //这里写需要调用的方法名称
3、设置查询参数
1、拼接lambda
var parameterExpression=Expression.Parameter(entityType,"x");
var propertyExpression = Expression.Property(parameterExpression, "字段名称");
var constantExpression = Expression.Constant(ConvertFieldValue("字段的值", propertyExpression.Type));
var equalExpression = Expression.Equal(propertyExpression,constantExpression);
var lambdaExpression = Expression.Lambda(equalExpression, parameterExpression); private object ConvertFieldValue(string fieldValue, Type type)
{
if (type == typeof(DateTime))
{
return DateTime.ParseExact(fieldValue, "dd/MM/yyyy HH:mm:ss",CultureInfo.InvariantCulture);
}
else if (type == typeof(bool))
{
return Convert.ToBoolean(fieldValue);
}
else if (type == typeof(int))
{
return Convert.ToInt32(fieldValue);
}
else if (type == typeof(long))
{
return Convert.ToInt64(fieldValue);
}
else
{
return fieldValue;
}
}
2、设置参数
//获取参数列表
var parameters = queryMethod.GetParameters();
var arguments = new List<object>();
for (int i = 0; i < parameters.Length; i++)
{
if (i == 0)
{
//如果不需要根据条件查询可以直接设置为默认值
arguments.Add(lambdaExpression);
}
else
{
//设置其他参数为默认值
arguments.Add(Missing.Value);
}
}
4、调用方法
var list = queryMethod.Invoke(repository, arguments.ToArray());
结尾
以上就是所有实现的代码,如果有更好的实现方式,可以在评论区留言,谢谢大家
C# 根据前台传入实体名称,动态查询数据的更多相关文章
- Mybatis 传入多个参数查询数据 (3种方法)
第一种方案 DAO层的函数方法 public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...
- SQL存储过程动态查询数据区间
以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...
- 自己写的一个关于Linq to Entity 动态查询的例子
这两天一直想写一个动态查询的方式,先是晚上查询了一下,发现大家写的差不多都是一样的[如:http://www.cnblogs.com/ASPNET2008/archive/2012/10/28/274 ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
- Linq 支持动态字查询集合, 也就是说根据传入的值进行查询。
Linq 支持动态字查询集合, 也就是说根据传入的值进行查询. 比如我们有个类Patient, 其中有个字段PatientName, 现在有Patient集合, 想要查询PatientName为&qu ...
- flask_sqlalchemy获取动态 model名称 和 动态查询
需求 想要实现动态的查询,表名,字段,字段值都不是固定的 obj=表名.query.filter_by(字段=值1).first() obj.字段=值2 首先动态获取db_model名字(即Role) ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...
随机推荐
- 关于IllegalMonitorStateException异常的解释之一
注意 在同步控制方法或同步控制块里调用wait(),notify()和notifyAll().如果在非同步控制方法里调用这些方法,程序能通过编译,但运行的时候,将得到IllegalMonitorSta ...
- poi读取Excel文件,数字变成科学计数法及数字自动带上“.0”的处理办法
解决poi解析excel遇到数值类型科学计数问题 NumberFormat nf = NumberFormat.getInstance();HSSFCell cell= hssfRow.getCell ...
- STL练习-简单计算器
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非 ...
- (十三).CSS3中的变换(transform),过渡(transition),动画(animation)
1 变换 transform 1.1 变换相关 CSS 属性 CSS 属性名 含义 值 transform 设置变换方式 transform-origin 设置变换的原点 使用关键字或坐标设置位置 t ...
- java的死锁与解决方法
一.什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无限等待. 二.产生死锁的原因与四个条件 2.1 死锁原因 竞争资 ...
- lnmp重新安装mysql
安装mysql好长时间,一直没去管,后来一直频繁重启,各种网上找方案去解决,最后问题太异常,一顿操作猛如虎之后把mysql彻底搞垮,无奈只能进行重装. whereis mysql mysql: /us ...
- Postgresql 或GreenPlum 查询结果部分字段转json格式并保留字段名(row_to_json)
-- 一些搜索结果给出 部分字段转json保留原字段的方式是用子查询select row_to_json(t) from ( select id, text from words ) t 但是如果子查 ...
- IPAD变成电脑的副屏
IPAD变成电脑的副屏方法一:把平板电脑变成显示器:Splashtop Wired XDisplayhttps://www.splashtop.cn/cn/wiredxdisplay方法二:space ...
- pom文件信息的解析
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 字符集编码cp936、ANSI、UNICODE、UTF-8、GB2312、GBK、GB18030、DBCS、UCS
一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS--是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's go! ...