C#根据前台传入实体名称实现动态查询数据

目录
  • 前言
  • 1、获取实体类型
  • 2、创建动态仓储
  • 3、设置查询参数
    • 1、拼接lambda
    • 2、设置参数
  • 4、调用方法

前言

项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如: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#根据前台传入实体名称实现动态查询数据的文章就介绍到这了,更多相关C#动态查询数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#实现自由组合本地缓存、分布式缓存和数据查询

    一.背景介绍: 我们在进行数据存储的时候,有时候会加入本地缓存.分布式缓存以及数据库存储三级的结构,当我们取值的时候经常是像下面这样的流程: 1.先取本地缓存,如果值存在直接返回 2.本地缓存不存在,获取分布式缓存,存在直接返回,并更新本地缓存 3.分布式缓存不存在,查询数据库,更新分布式缓存.更新本地缓存,最后返回 但如果对于一些场景,可能只有本地缓存.只有分布式缓存或者说上面三种的几种组合,我们怎么要应对这样的变化,怎么能抽象出一套方式,能够应对各种不同数据存储方式造成的变化. 二.设计思路

  • C#使用linq查询大数据集的方法

    本文实例讲述了C#使用linq查询大数据集的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LargeNumberQuery { class Program { static void Main(string[] args) { int[] numbers = CreateNumbers(7384738); Con

  • 利用C#实现分布式数据库查询

    随着传统的数据库.计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注.但由于其开发较为复杂,在一定程度上制约了它的发展.基于此,本文提出了在.Net环境下使用一种新的开发语言C#结合ADO.Net数据访问模型来开发分布式数据库系统,大大简化了开发过程. 1 分布式数据库系统 就其本质而言,分布式数据库系统的数据在逻辑上是统一的,而在物理上却是分散的.与集中式数据库相比它有如下主要优点: · 解决组织机构分散而数据需要相互联系的

  • C#连接SQL数据库和查询数据功能的操作技巧

    大数据时代在编程可能需要用到一些文本内容,不可能全部写到代码里,不好更改,用户也不方便使用 所以需要用到我们的数据库来保存这些数据,直接更改数据 SQL: 下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 1.下载后打开选择登录:Windows身份验证 2.创建登录的账号和密码(右键创建) 3.创建数据库表 表的右键新建即可 "dbo.table_1" 就是创建成功的 4.导入数据 这里以 信息表为

  • C# DataTable中查询指定字段名称的数据

    1.查询后获取对应的数据集后,传递参数strcodeName,根据数据集中strcodeName的匹配对应字段,获取数据集中对应的目的字段 复制代码 代码如下: private string GetStrName(DataTable dtable, string strcodeName) {             string Name = strcodeName;             DataRow[] dr = dtable.Select("匹配对应字段=" + strcod

  • C#根据前台传入实体名称实现动态查询数据

    目录 前言 1.获取实体类型 2.创建动态仓储 3.设置查询参数 1.拼接lambda 2.设置参数 4.调用方法 前言 项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser 1.获取实体类型 var entityType=Assembly.Load("XXX.Entity").GetTypes().Any(a =>a.Name == entity

  • jQuery easyui datagrid动态查询数据实例讲解

    该插件组小巧使用方便,以下是一个从前台提交查询条件,从MSSQL返回json数据的一个事例 HTML前端代码 复制代码 代码如下: <?php include_once("auth.php"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel=&qu

  • Hibernate传入Java对象创建动态表并录入数据

    看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据 我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据 注意: 由于业务需要,这里对于字段的支持只有int和Integer,double和Double 还有String,同时对于String统一创建为了Varchar(100)的字

  • javascript实现根据函数名称字符串动态执行函数的方法示例

    本文实例讲述了javascript实现根据函数名称字符串动态执行函数的方法.分享给大家供大家参考,具体如下: <script> //动态函数调用,调用者使用"targetFunction" function targetFunction() { alert(11111); return 9; } test("myFunc"); function test(funcName) { if(typeof(eval(funcName)) == "fun

  • ajax动态查询数据库数据并显示在前台的方法

    今天做了一个ajax动态查询数据库的小Demo,又重新学习了一下ajax的一些知识.在此和大家分享一下...... 啥都别说了,先上代码 Controller层 查询总用户数 @RequestMapping(value = "/findTotalUsers.do",method = RequestMethod.GET) public @ResponseBody Long findTotalUsers(){ ModelAndView modelAndView = new ModelAnd

  • Spring Data JPA中的动态查询实例

    spring Data JPA大大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的. 比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用hibernate的时候,可以通过判断条件来拼接SQL(HQL),当然,Spring Data JPA在简化我们开发的同时,也是提供了支持的. 通过实现Criteria二实现的动态查询,需要我们的Repo接口继承JpaSpecificationExecutor接口,这是个泛型接口. 然后查询的时候,传入动态

  • MyBatis实现动态查询、模糊查询功能

    要实现查询,咱们就先有个数据库,截图如下,其中cityAreaId是外键,本次可以忽略: 下面Branches是我的实体类,里面有name和address属性: 接口中方法: public List<Branches> finDongTai(@Param("name")String name,@Param("add")String address);//动态 public List<Branches> findLike(@Param(&quo

  • Spring data jpa的使用与详解(复杂动态查询及分页,排序)

    一. 使用Specification实现复杂查询 (1) 什么是Specification Specification是springDateJpa中的一个接口,他是用于当jpa的一些基本CRUD操作的扩展,可以把他理解成一个spring jpa的复杂查询接口.其次我们需要了解Criteria 查询,这是是一种类型安全和更面向对象的查询.而Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor. 而JpaSpecifica

  • C#用表达式树构建动态查询的方法

    前文介绍了C#中表达式树的基本知识,在实际中,表达式树有很多用法,这里举几个例子,说明如何使用表达式树构建动态查询,从而扩展LINQ的查询方法. 在LINQ中,只要数据源实现了IQuerable<T>接口,表达式树就可以用来表示结构化查询.比如,LINQ提供了用来查询关系数据源的IQueryable<T>接口的实现,C#编译器在执行这类数据源查询时,会在运行时生成表达式树,然后,查询会遍历表达式树的数据结构,然后将其转换成针对特定数据源的合适的查询语言. 下面的几个例子演示了如何使

  • springdata jpa使用Example快速实现动态查询功能

    目录 Example官方介绍 Example api的组成 限制 使用 测试查询 自定匹配器规则 补充 官方创建ExampleMatcher例子(1.8 lambda) StringMatcher 参数 总结 Example官方介绍 Query by Example (QBE) is a user-friendly querying technique with a simple interface. It allows dynamic query creation and does not r

随机推荐