目錄 前言 最近使用 "ABP(ASP.NET Boilerplate)" 做項目,有些查詢(或存儲過程)直接使用sql語句會更方便一點。 定義一個介面 在Core項目中定義一個介面,如:ISqlExecuter 實現介面 項目中使用的是EF,因此在EntityFramework項目中實現該介面 使 ...
目錄
前言
最近使用ABP(ASP.NET Boilerplate)做項目,有些查詢(或存儲過程)直接使用sql語句會更方便一點。
定義一個介面
在Core項目中定義一個介面,如:ISqlExecuter
public interface ISqlExecuter
{
/// <summary>
/// 執行給定的命令
/// </summary>
/// <param name="sql">命令字元串</param>
/// <param name="parameters">要應用於命令字元串的參數</param>
/// <returns>執行命令後由資料庫返回的結果</returns>
int Execute(string sql, params object[] parameters);
/// <summary>
/// 創建一個原始 SQL 查詢,該查詢將返回給定泛型類型的元素。
/// </summary>
/// <typeparam name="T">查詢所返回對象的類型</typeparam>
/// <param name="sql">SQL 查詢字元串</param>
/// <param name="parameters">要應用於 SQL 查詢字元串的參數</param>
/// <returns></returns>
IQueryable<T> SqlQuery<T>(string sql, params object[] parameters);
}
實現介面
項目中使用的是EF,因此在EntityFramework項目中實現該介面
public class SqlExecuter : ISqlExecuter, ITransientDependency
{
private readonly IDbContextProvider<XXXDbContext> _dbContextProvider;
public SqlExecuter(IDbContextProvider<XXXDbContext> dbContextProvider)
{
_dbContextProvider = dbContextProvider;
}
/// <summary>
/// 執行給定的命令
/// </summary>
/// <param name="sql">命令字元串</param>
/// <param name="parameters">要應用於命令字元串的參數</param>
/// <returns>執行命令後由資料庫返回的結果</returns>
public int Execute(string sql, params object[] parameters)
{
return _dbContextProvider.DbContext.Database.ExecuteSqlCommand(sql, parameters);
}
/// <summary>
/// 創建一個原始 SQL 查詢,該查詢將返回給定泛型類型的元素。
/// </summary>
/// <typeparam name="T">查詢所返回對象的類型</typeparam>
/// <param name="sql">SQL 查詢字元串</param>
/// <param name="parameters">要應用於 SQL 查詢字元串的參數</param>
/// <returns></returns>
public IQueryable<T> SqlQuery<T>(string sql, params object[] parameters)
{
return _dbContextProvider.DbContext.Database.SqlQuery<T>(sql, parameters).AsQueryable<T>();
}
}
使用ITransientDependency介面abp會自動註冊。
使用
我們一般會在Application項目中使用。
首先我們需要註入:
使用構造函數的方式註入
private readonly ISqlExecuter _sqlExecuter;
public XXXAppService(ISqlExecuter sqlExecuter)
{
_sqlExecuter = sqlExecuter;
}
使用IocManager註入
var sqlExecuter = IocManager.Instance.Resolve<ISqlExecuter>();
調用
public IEnumerable<OrderChartDto> GetOrderChartData()
{
const string sql = "select * from Orders";
var charts = _sqlExecuter.SqlQuery<OrderChartDto>(sql).ToList();
return charts;
}
值得註意的是,調用代碼需要工作單元的支持,Application中已預設支持,可直接使用。但如果在Controller中使用就需要將Action設置為UnitOfWork
[UnitOfWork] public virtual ActionResult GetOrderChartData() { .... }