使用场景:一般情况下,使用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 即可
  }