使用场景:一般情况下,使用EF中的查询语法可以帮助我们完成绝大部分业务,但是遇到一些复杂的查询语句,需要 SQL 才可以完成的话(比如我现在遇到的两张不同的表要合并数据,并且根据时间排序且做分页),我们就只能够通过查询 SQL 的方法才可以完成
对于.Net 的 EF
直接使用 Entity DbContext 实例化出来的对象
_DBContext.Database.SqlQuery<object>(“sql”); 适合 select 的操作,返回结果集
_DBContext.Database.ExecuteSqlCommand(“sql”);适合 insert update delete 操作,返回影响的数据数量
对于 .Net Core 的 EF
同样直接使用 Entity DbContext 实例化出来的对象
_DBContext.Database.ExecuteSqlCommand(“sql”);
可惜的是并没有 SqlQuery 的方法,无法返回自己自定义的实体结果,所以如果我们需要该方法,可以自己写一个扩展类(待更新)
对于 .Net ABP框架 的 EF
ABP默认地为每个实体类型自动创建一个默认仓储,直接注入IRepository<TEntity>(或IRepository<TEntity,TPrimaryKey>)便可以实现对数据库的操作,所以如果我们需要执行 SQL,按照ABP的设计原则,我们需要自定义仓储来进行实现
首先创建一个仓储接口
public interface IMyRepository { IEnumerable QueryData(); }
创建一个类实现该接口
public class MyRepository: PomeloRepositoryBase, IMyRepository { public MyRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) { } public IEnumerable QueryData() { string sql = @""; return Context.Database.SqlQuery(sql); } }
最后在应用层进行依赖注入,便可直接调用该方法
private readonly IMyRepository _myRepository; public MyServices( IMyRepository myRepository ){ _myRepository=myRepository; } public void Test(){ var query = _myRepository.QueryData();至于剩下的其他如分页,条件筛选等操作使用 Lambda 即可 }