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比较好.但是如果公司用这个就没办法了,可以 ...
随机推荐
- ubuntu16.04openssh升级
wget http://zlib.net/zlib-1.2.11.tar.gz tar xf zlib-1.2.11.tar.gz && cd zlib-1.2.11/ ./confi ...
- Verilog 变量中位的数值类型
Verilog 变量中位的数值类型 Verilog变量中每个位(bit)的数值类型有四种,分别为1,0,Z,X.其中1,0比较明确就是高.低电平.而x, z在逻辑设计中也经常用到来建模.X,Z既可以大 ...
- Idea项目构建时解决方法
java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded 整 ...
- cf823div2C
cf823div2C 题目链接 题目 给你两个字符串\(s_1,s_2\).每次操作可以让\(s_1\)的前k个和\(s_2\)的后k个交换.询问是否可以通过多次上述操作,使得\(s_1=s_2\). ...
- CMake指定的任务可执行文件"cmd.exe" 未能运行。System.IO.IOException:未能创建临时文件。临时文件夹已满或其路径不正确。对路径"......exec.cmd "的访问被拒绝
我觉得是我使用VS2022的原因,网上也没有找到相同的问题.
- 在Windows平台上利用CMD命令行来压缩和解压缩.tar.gz压缩包
解压命令: tar -xzvf dwt.tar.gz -C tmp/ 上述命令将dwt.tar.gz压缩包解压到tmp/文件夹 压缩命令: tar -czvf dwt.tar.gz dwt/ 上述命令 ...
- SQL 2019 卸载方法
一.关闭服务 1. win+r services.msc 打开服务,关闭与SQL有关的服务内容. 二.卸载应用 1.win+r control 打开控制面板---卸载程序---卸 ...
- Mysql 行号+分组行号+取Top记录 SQL
Mysql 行号+分组行号+取Top记录 SQL select * from ( SELECT (@rowNum := @rowNum + 1) as rowNum -- 全量行号 , a.col1 ...
- java中取数组第一个元素
java中取数组第一个元素 var a=[1,2,2,3,4];console.log(a);a.shift();console.log(a); pop:删除原数组最后一项,并返回删除元素的值 ...
- win10、win11安装子系统kali linux、图形化界面的安装
1.开启安装Linux子系统需要的扩展 Win+Q搜索功能 勾选需要的扩展,Hyper-V.Windows 虚拟机监控平台.适用于Linux的Windows子系统.虚拟机平台 反正这些有关于虚拟机的全 ...