可以通过FalconSPReturnTypeAttribute特性在存储过程参数模型中定义返回结果模型
This commit is contained in:
parent
bad9973d3c
commit
5943fc6247
|
@ -49,13 +49,13 @@ namespace Falcon.ModelSP.Test
|
||||||
public void InMemoryDbTest() {
|
public void InMemoryDbTest() {
|
||||||
//内存数据库无法使用关系模型,测试无法进行
|
//内存数据库无法使用关系模型,测试无法进行
|
||||||
return;
|
return;
|
||||||
using(var db = TestDbContext.GetDbInMemory()) {
|
//using(var db = TestDbContext.GetDbInMemory()) {
|
||||||
var re = db.Pr_AddOne(new Pr_AddOne { A = 1 });
|
// var re = db.Pr_AddOne(new Pr_AddOne { A = 1 });
|
||||||
Assert.IsTrue(re != null);
|
// Assert.IsTrue(re != null);
|
||||||
Assert.IsTrue(re.Any());
|
// Assert.IsTrue(re.Any());
|
||||||
var first = re.First();
|
// var first = re.First();
|
||||||
Assert.IsTrue(first.Aa == 2);
|
// Assert.IsTrue(first.Aa == 2);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Reflection;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using System;
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage;
|
||||||
|
|
||||||
namespace Falcon.ModelSP
|
namespace Falcon.ModelSP
|
||||||
{
|
{
|
||||||
|
@ -42,6 +43,61 @@ namespace Falcon.ModelSP
|
||||||
return db.Database.SqlQuery<TResultType>(getProcuderName<TPrarmType>(),parms.ToArray()).ToList();
|
return db.Database.SqlQuery<TResultType>(getProcuderName<TPrarmType>(),parms.ToArray()).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通过存储过程参数模型及参数模型定义的返回类型执行查询
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">存储过程参数类型</typeparam>
|
||||||
|
/// <param name="db">数据库上下文</param>
|
||||||
|
/// <param name="data">参数数据</param>
|
||||||
|
/// <returns>存储过程结果集</returns>
|
||||||
|
public static IEnumerable<object> RunSPQuery<T>(this DbContext db,T data) {
|
||||||
|
var attr = typeof(T).GetCustomAttribute<FalconSPReturnTypeAttribute>(false);
|
||||||
|
if(attr == null) {
|
||||||
|
throw new Exception("参数类必须定义FalconSPReturnTypeAttribute特性,否则需要明确指定返回值类型");
|
||||||
|
}
|
||||||
|
var type = attr.ReturnType;
|
||||||
|
return RunSPQuery(db,data,typeof(T),type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通过提供的参数,参数类型和返回类型执行存储过程
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="db">数据库上下文</param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <param name="parasType">参数类型</param>
|
||||||
|
/// <param name="returnType">返回类型</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static IEnumerable<object> RunSPQuery(DbContext db,object data,Type parasType,Type returnType) {
|
||||||
|
var pm = getProcuderName(parasType);
|
||||||
|
var paras = getParams(data).ToArray();
|
||||||
|
var connection = db.Database.GetDbConnection();
|
||||||
|
using(var cmd = connection.CreateCommand()) {
|
||||||
|
cmd.CommandText = pm;
|
||||||
|
cmd.CommandType = System.Data.CommandType.StoredProcedure;
|
||||||
|
cmd.Parameters.AddRange(paras);
|
||||||
|
connection.Open();
|
||||||
|
var dr = cmd.ExecuteReader();
|
||||||
|
var result = new List<object>();
|
||||||
|
if(!dr.CanGetColumnSchema())
|
||||||
|
return result;
|
||||||
|
while(dr.Read()) {
|
||||||
|
var item = returnType.Assembly.CreateInstance(returnType.FullName);
|
||||||
|
var columnSchema = dr.GetColumnSchema();
|
||||||
|
for(var i = 0;i < columnSchema.Count;i++) {
|
||||||
|
var name = dr.GetName(i);
|
||||||
|
var value = dr.IsDBNull(i) ? null : dr.GetValue(i);
|
||||||
|
var pi = parasType.getProperty(name);
|
||||||
|
if(pi == null || !pi.CanWrite)
|
||||||
|
continue;
|
||||||
|
pi.SetValue(item,value);
|
||||||
|
}
|
||||||
|
result.Add(item);
|
||||||
|
}
|
||||||
|
connection.Close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取存储过程参数枚举
|
/// 获取存储过程参数枚举
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -88,6 +144,18 @@ namespace Falcon.ModelSP
|
||||||
return typeof(T).Name;
|
return typeof(T).Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取存储过程名
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">类型</param>
|
||||||
|
public static string getProcuderName(Type type) {
|
||||||
|
var attr = type.GetCustomAttribute<FalconSPProcuderNameAttribute>(true);
|
||||||
|
if(attr != null && attr is FalconSPProcuderNameAttribute pna && !string.IsNullOrEmpty(pna.ProcuderName)) {
|
||||||
|
return pna.ProcuderName;
|
||||||
|
}
|
||||||
|
return type.Name;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 根据传入的sql语句和参数枚举执行存储过程,并且返回类型枚举
|
/// 根据传入的sql语句和参数枚举执行存储过程,并且返回类型枚举
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -125,12 +193,22 @@ namespace Falcon.ModelSP
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 忽略大小写获取类型的属性
|
/// 忽略大小写获取类型的属性
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static PropertyInfo getProperty<T>(string name) {
|
private static PropertyInfo getProperty<T>(string name) {
|
||||||
var type = typeof(T);
|
return getProperty(typeof(T),name);
|
||||||
foreach(var item in type.GetProperties()) {
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 忽略大小写获取类型的属性
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">类型</param>
|
||||||
|
/// <param name="name">属性名称</param>
|
||||||
|
/// <returns>属性</returns>
|
||||||
|
private static PropertyInfo getProperty(this Type t,string name) {
|
||||||
|
foreach(var item in t.GetProperties()) {
|
||||||
if(item.Name.ToLower() == name.ToLower()) {
|
if(item.Name.ToLower() == name.ToLower()) {
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<AssemblyVersion>1.0.3.0</AssemblyVersion>
|
<AssemblyVersion>1.0.4.0</AssemblyVersion>
|
||||||
<FileVersion>1.0.3.0</FileVersion>
|
<FileVersion>1.0.4.0</FileVersion>
|
||||||
<Version>1.0.3</Version>
|
<Version>1.0.4</Version>
|
||||||
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
|
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
|
||||||
<PackageProjectUrl>http://39.105.71.191/Falcon/Falcon.ModelSP</PackageProjectUrl>
|
<PackageProjectUrl>http://106.14.65.137/Falcon/Falcon.ModelSP</PackageProjectUrl>
|
||||||
<RepositoryUrl>http://39.105.71.191/Falcon/Falcon.ModelSP</RepositoryUrl>
|
<RepositoryUrl>http://106.14.65.137/Falcon/Falcon.ModelSP</RepositoryUrl>
|
||||||
<Description>EF Core 存储过程执行组件,可以模型化执行存储过程</Description>
|
<Description>EF Core 存储过程执行组件,可以模型化执行存储过程</Description>
|
||||||
<Authors>Falcon</Authors>
|
<Authors>Falcon</Authors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace Falcon.ModelSP
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 定义存储过程名称
|
/// 定义存储过程名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
public class FalconSPProcuderNameAttribute:Attribute
|
public class FalconSPProcuderNameAttribute:Attribute
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
21
Falcon.ModelSP/FalconSPReturnTypeAttribute.cs
Normal file
21
Falcon.ModelSP/FalconSPReturnTypeAttribute.cs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Falcon.ModelSP
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 定义存储过程返回值类型
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Class,AllowMultiple =false,Inherited =false)]
|
||||||
|
public class FalconSPReturnTypeAttribute:Attribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 返回的数据类型
|
||||||
|
/// </summary>
|
||||||
|
public Type ReturnType { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 定义存储过程名称
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">存储过程返回值类型</param>
|
||||||
|
public FalconSPReturnTypeAttribute(Type t) => this.ReturnType = t;
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,8 +27,32 @@ namespace Falcon.ModelSP
|
||||||
/// <param name="data">存储过程参数</param>
|
/// <param name="data">存储过程参数</param>
|
||||||
/// <returns>返回数据枚举</returns>
|
/// <returns>返回数据枚举</returns>
|
||||||
public IEnumerable<TResultType> RunSP<TPrarmType, TResultType>(DbContext db,TPrarmType data)
|
public IEnumerable<TResultType> RunSP<TPrarmType, TResultType>(DbContext db,TPrarmType data)
|
||||||
|
where TResultType : class, new() {
|
||||||
|
return RunSPQuery<TPrarmType,TResultType>(db,data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行存储过程
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TPrarmType">参数类型</typeparam>
|
||||||
|
/// <typeparam name="TResultType">返回值枚举的类型</typeparam>
|
||||||
|
/// <param name="db">数据上下文</param>
|
||||||
|
/// <param name="data">存储过程参数</param>
|
||||||
|
/// <returns>返回数据枚举</returns>
|
||||||
|
public IEnumerable<TResultType> RunSPQuery<TPrarmType, TResultType>(DbContext db,TPrarmType data)
|
||||||
where TResultType : class, new() {
|
where TResultType : class, new() {
|
||||||
return db.RunProcuder<TPrarmType,TResultType>(data);
|
return db.RunProcuder<TPrarmType,TResultType>(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据模型定义参数执行存储过程进行查询,参数类型必须定义FalconSPReturnTypeAttribute特性
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TPrarmType">存储过程参数类型</typeparam>
|
||||||
|
/// <param name="db">数据上下文</param>
|
||||||
|
/// <param name="data">存储过程参数</param>
|
||||||
|
/// <returns>返回类型枚举FalconSPReturnTypeAttribute定义的类型枚举。</returns>
|
||||||
|
public IEnumerable<object> RunSPQuery<TPrarmType>(DbContext db,TPrarmType data) {
|
||||||
|
return db.RunSPQuery(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,5 +24,23 @@ namespace Falcon.ModelSP
|
||||||
/// <param name="db">数据上下文</param>
|
/// <param name="db">数据上下文</param>
|
||||||
/// <param name="data">参数数据</param>
|
/// <param name="data">参数数据</param>
|
||||||
IEnumerable<TResultType> RunSP<TPrarmType, TResultType>(DbContext db,TPrarmType data) where TResultType : class, new();
|
IEnumerable<TResultType> RunSP<TPrarmType, TResultType>(DbContext db,TPrarmType data) where TResultType : class, new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通过数据库上下文执行存储过程,并返回查询结果
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TPrarmType">参数类型</typeparam>
|
||||||
|
/// <typeparam name="TResultType">返回结果项类型</typeparam>
|
||||||
|
/// <param name="db">数据上下文</param>
|
||||||
|
/// <param name="data">参数数据</param>
|
||||||
|
IEnumerable<TResultType> RunSPQuery<TPrarmType, TResultType>(DbContext db,TPrarmType data) where TResultType : class, new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据模型定义参数执行存储过程进行查询,参数类型必须定义FalconSPReturnTypeAttribute特性
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TPrarmType">存储过程参数类型</typeparam>
|
||||||
|
/// <param name="db">数据上下文</param>
|
||||||
|
/// <param name="data">存储过程参数</param>
|
||||||
|
/// <returns>返回类型枚举FalconSPReturnTypeAttribute定义的类型枚举。</returns>
|
||||||
|
IEnumerable<object> RunSPQuery<TPrarmType>(DbContext db,TPrarmType data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user