C#根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)
前言
項(xiàng)目中時(shí)不時(shí)遇到查字典表等數(shù)據(jù),只需要返回?cái)?shù)據(jù),不需要寫其他業(yè)務(wù),每個(gè)字典表可能都需要寫一個(gè)接口給前端調(diào)用,比較麻煩,所以采用下面這種方式,前端只需傳入實(shí)體名稱即可,例如:SysUser
1、獲取實(shí)體類型
var entityType=Assembly.Load("XXX.Entity").GetTypes().Any(a =>a.Name == entityName).FirstOrDefault().FullName;
如果需要加載多個(gè)類庫(以下是其中一種方式)
1、先獲取DBContext里面的對(duì)象來匹配實(shí)體名稱得到他的命名空間
var name = DBContext.Model.GetEntityTypes().Where(a => a.ClrType.Name == "傳入的實(shí)體名稱").Select(a => a.ClrType.Namespace).FirstOrDefault();
2、根據(jù)命名空間匹配到程序集
var assemblyName = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains(name)).Select(a => a.FullName).FirstOrDefault();
3、獲取實(shí)體類型
var entityType = Assembly.Load(assemblyName).GetTypes().Where(a => a.Name == "傳入的實(shí)體名稱").FirstOrDefault();
2、創(chuàng)建動(dòng)態(tài)倉儲(chǔ)
var repositoryType = typeof(Repository<>).MakeGenericType(entityType);//Repository<> 一般項(xiàng)目會(huì)封裝倉儲(chǔ)層放一些CRUD的公共方法
var repository = Activator.CreateInstance(repositoryType, DBContext);
var queryMethod = repositoryType.GetMethod("GetList"); //這里寫需要調(diào)用的方法名稱
3、設(shè)置查詢參數(shù)
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、設(shè)置參數(shù)
//獲取參數(shù)列表
var parameters = queryMethod.GetParameters();
var arguments = new List<object>();
for (int i = 0; i < parameters.Length; i++)
{
if (i == 0)
{
//如果不需要根據(jù)條件查詢可以直接設(shè)置為默認(rèn)值
arguments.Add(lambdaExpression);
}
else
{
//設(shè)置其他參數(shù)為默認(rèn)值
arguments.Add(Missing.Value);
}
}
4、調(diào)用方法
var list = queryMethod.Invoke(repository, arguments.ToArray());
到此這篇關(guān)于C#根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C#動(dòng)態(tài)查詢數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析WPF中常用屬性的相關(guān)概念和應(yīng)用
在WPF開發(fā)中,經(jīng)常聽到各種屬性,如:依賴屬性,附加屬性,CLR屬性,那這些不同類型的屬性,具體又有什么作用呢,下面就跟隨小編一起來學(xué)習(xí)一下吧2024-03-03
詳解C#中使用對(duì)象或集合的初始值設(shè)定項(xiàng)初始化的操作
這篇文章主要介紹了詳解C#中使用對(duì)象或集合的初始值設(shè)定項(xiàng)初始化的操作,文中分別講了對(duì)對(duì)象和字典的初始化,需要的朋友可以參考下2016-01-01
C#通過IComparable實(shí)現(xiàn)ListT.sort()排序
這篇文章主要介紹了C#通過IComparable實(shí)現(xiàn)ListT.sort()排序的方法,可實(shí)現(xiàn)自定義的排序方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
C# 制作PictureBox圓形頭像框并從數(shù)據(jù)庫中讀取頭像
C#提供的PictureBox控鍵默認(rèn)情況下是方形的非常大的影響美觀,怎么解決這一問題呢?下面小編給大家?guī)砹薈# 制作PictureBox圓形頭像框并從數(shù)據(jù)庫中讀取頭像的操作代碼,感興趣的朋友一起學(xué)習(xí)下吧2021-08-08
C#獲取每個(gè)年,月,周的起始日期和結(jié)束日期的方法
這篇文章主要介紹了C#獲取每個(gè)年,月,周的起始日期和結(jié)束日期的方法,涉及C#時(shí)間與日期基本操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
C#使用CefSharp和網(wǎng)頁進(jìn)行自動(dòng)化交互的示例代碼
CefSharp 是一個(gè)用 C# 編寫的開源庫,它封裝了 Google Chrome 瀏覽器的 Chromium 內(nèi)核,CefSharp 允許開發(fā)者在其應(yīng)用程序中嵌入瀏覽器功能,從而能夠展示網(wǎng)頁內(nèi)容、執(zhí)行JavaScript代碼,本文給大家介紹了C#使用CefSharp和網(wǎng)頁進(jìn)行自動(dòng)化交互,需要的朋友可以參考下2024-07-07
C#實(shí)現(xiàn)設(shè)置或屏蔽熱鍵的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)設(shè)置或屏蔽熱鍵,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
c#動(dòng)態(tài)改變webservice的url訪問地址
這篇文章主要介紹了c#動(dòng)態(tài)改變webservice的url訪問地址,需要的朋友可以參考下2014-03-03
C#中控制遠(yuǎn)程計(jì)算機(jī)的服務(wù)的方法
C#中控制遠(yuǎn)程計(jì)算機(jī)的服務(wù)的方法...2007-04-04

