EntityFrameworkCoreRawSQL

EntityFramework Core Raw SQL

基础查询(执行SQL和存储过程)

啥也不说了,拿起键盘就是干,如下:

专注于为中小企业提供成都网站设计、网站制作、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业吴兴免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

 EntityFramework Core Raw SQL

    public class HomeController : Controller
    {        private IBlogRepository _blogRepository;        public HomeController(IBlogRepository blogRepository)
        {
            _blogRepository = blogRepository;
        }        public IActionResult Index()
        {            var list = _blogRepository.GetList();            return Ok();
        }
    }

 EntityFramework Core Raw SQL

 EntityFramework Core Raw SQL

    public class BlogRepository : EntityBaseRepository,
        IBlogRepository
    {        private EFCoreContext _efCoreContext;        public BlogRepository(EFCoreContext efCoreContext) : base(efCoreContext)
        {
            _efCoreContext = efCoreContext;
        }        public IEnumerable GetList()
        {            var iQueryTable = _efCoreContext.Set().
                FromSql("select * from Blog");            return iQueryTable.ToList();
        }
    }

 EntityFramework Core Raw SQL

 EntityFramework Core Raw SQL

下面我们来看看存储过程。

 EntityFramework Core Raw SQL

CREATE PROCEDURE dbo.GetBlogList
AS
BEGIN
    SELECT * FROM dbo.Blog
END
GO

 EntityFramework Core Raw SQL

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var iQueryTable = _efCoreContext.Set().
                FromSql("EXECUTE  dbo.GetBlogList");            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

参数查询 

利用参数化存储过程查询。

 EntityFramework Core Raw SQL

* FROM dbo.Blog WHERE Id =

 EntityFramework Core Raw SQL

结果利用FromSql就变成了如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var Id = new SqlParameter("Id", "1");            var iQueryTable = _efCoreContext.Set().
                FromSql("EXEC dbo.GetBlogList {0}", 1);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

上述是利用string.format的形式来传参,我们也可以利用SqlParameter来传参,如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var Id = new SqlParameter("Id", "1");            var iQueryTable = _efCoreContext.Set().
                FromSql("EXEC dbo.GetBlogList @id", Id);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

我们通过开启调试,可以清晰看到执行的存储过程。

 EntityFramework Core Raw SQL

通过如上我们知道参数化查询有两种形式,下面我们再来看看linq查询。

linq查询

上述我们演示一直直接使用FromSql,其实在此之后我们可以继续通过linq来进行查询,如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var Id = new SqlParameter("Id", "2");            var iQueryTable = _efCoreContext.Set().
                FromSql("EXEC dbo.GetBlogList @id", Id).Where(d => d.Name == "efcore2");            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

之前我们映射了Blog和Post之间的关系,这里我们只能查询出Blog表的数据,通过对上述linq的讲解,我们完全可以通过inlcude来显式加载Post表数据,如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var Id = new SqlParameter("Id", "2");            var iQueryTable = _efCoreContext.Set().
                FromSql("EXEC dbo.GetBlogList @id", Id).Include(d => d.Posts);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

 EntityFramework Core Raw SQL

好吧,明确告诉我们对于存储过程是不支持Inlude操作的,所以要想Include我们只能进行简单的查询,如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var iQueryTable = _efCoreContext.Set().
                FromSql("select * from blog").Include(d => d.Posts);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

查找官网资料时发现居然对表值函数(TVF)是可以Include的,创建内嵌表值函数如下:

 EntityFramework Core Raw SQL

USE [EFCoreDb]
GO

IF OBJECT_ID('dbo.GetBlog') IS NOT NULL
    DROP FUNCTION dbo.GetBlog;
GO

CREATE FUNCTION dbo.GetBlog 
    (@Name VARCHAR(max)) RETURNS TABLE WITH SCHEMABINDING
AS   
RETURN
 SELECT Id, Name, Url FROM dbo.Blog WHERE Name = @Name
GO

 EntityFramework Core Raw SQL

调用如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var name = "efcore2";            var iQueryTable = _efCoreContext.Set().
                FromSql("select * from [dbo].[GetBlog] {0}", name).Include(d => d.Posts);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

结果出乎意料的出现语法错误:

 EntityFramework Core Raw SQL

通过SQL Server Profiler查看发送的SQL语句如下:

 EntityFramework Core Raw SQL

这能不错么,官网给的示例也是和上述一样,如下:

 EntityFramework Core Raw SQL

只是按照和他一样的搬过来了,未曾想太多,还是粗心大意了,想了好一会,按照我们正常调用表值函数即可,我们需要用括号括起来才行,如下:

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var name = "efcore2";            var iQueryTable = _efCoreContext.Set().
                FromSql("select * from [dbo].[GetBlog] ({0})", name).Include(d => d.Posts);            return iQueryTable.ToList();
        }

 EntityFramework Core Raw SQL

上述将[dbo.GetBlog]和({0})隔开和挨着都可以。这个时候才不会出现语法错误。执行的SQL如下才是正确的。

 EntityFramework Core Raw SQL

好了,到了这里关于EF Core中原始查询我们就告一段落了,其中还有一个知识点未谈及到,在EF Core我们可以直接通过底层的ADO.NET来进行查询,我们来看下:

底层ADO.NET查询

 EntityFramework Core Raw SQL

        public IEnumerable GetList()
        {            var list = new List();            using (var connection = _efCoreContext.Database.GetDbConnection())
            {
                connection.Open();                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT * FROM dbo.Blog";                    using (SqlDataReader reader = command.ExecuteReader() as SqlDataReader)
                    {                        while (reader.Read())
                        {                            var blog = new Blog();
                            blog.Id = Convert.ToInt32(reader["Id"]);
                            blog.Name = reader["Name"].ToString();
                            blog.Url = reader["Url"].ToString();
                            list.Add(blog);
                        }
                    }                      
                }
            }            return list;
        }

 EntityFramework Core Raw SQL

 EntityFramework Core Raw SQL


本文名称:EntityFrameworkCoreRawSQL
URL网址:http://ybzwz.com/article/jesiep.html