zoukankan      html  css  js  c++  java
  • Entity Framework Core系列教程-23-原生SQL查询

    在Entity Framework Core中执行原生SQL查询

    Entity Framework Core提供了DbSet.FromSql()方法来对基础数据库执行原始SQL查询,并将结果作为实体对象获取。
    下面的示例演示如何对MS SQL Server数据库执行原始SQL查询。

    var context = new SchoolContext();
    var students = context.Students
                      .FromSql("Select * from Students where Name = 'Bill'")
                      .ToList();
    

    在上面的示例中,在Student实体集(DbSet<Student>)之后使用FromSql()方法,因此指定的SQL查询必须从Student表返回记录,该记录将在Student实体中进行转换。 Entity Framework Core将执行对数据库的指定查询,即在上面的示例中,从* Name ='Bill’的Student中选择*。

    Parameterized Query(参数化查询)

    FromSql方法允许使用C#中的字符串插值语法进行参数化查询,如下所示。

    string name = "Bill";
    var context = new SchoolContext();
    var students = context.Students
                        .FromSql($"Select * from Students where Name = '{name}'")
                        .ToList();
    
    The following is also valid.
    string name = "Bill";
    var context = new SchoolContext();
    var students = context.Students
                        .FromSql("Select * from Students where Name = '{0}'", name)
                        .ToList();
    

    上面的示例将对SQL Server数据库执行以下SQL查询:

    exec sp_executesql N'Select * from Students where Name = ''@p0''
    ',N'@p0 nvarchar(4000)',@p0=N'Bill'
    go
    

    LINQ运算符

    您还可以在使用FromSql方法的原始查询之后使用LINQ运算符。

    string name = "Bill";
    var context = new SchoolContext();
    var students = context.Students
                        .FromSql("Select * from Students where Name = '{0}'", name)
                        .OrderBy(s => s.StudentId)
                        .ToList();
    

    在上面的示例中,EF Core通过将FromSql方法和OrderBy运算符结合在一起执行以下查询。

    exec sp_executesql N'SELECT [s].[StudentId], [s].[Name]
    FROM (
        Select * from Students where Name = ''@p0''
    ) AS [s]
    ORDER BY [s].[StudentId]',N'@p0 nvarchar(4000)',@p0=N'Bill'
    go
    

    FromSql的局限性

    SQL查询必须返回与DbSet<T>类型相同类型的实体。例如如果在学生之后使用FromSql,则指定的查询无法返回课程实体。从FromSql()方法返回临时类型在待办事项列表中。
    SQL查询必须返回表的所有列。例如context.Students.FromSql(“从学生中选择StudentId,LastName).ToList()将引发异常。
    SQL查询不能包含JOIN查询以获取相关数据。在FromSql()方法之后,使用Include方法加载相关实体。

  • 相关阅读:
    时间复杂度计算
    SQL Server2012编程入门经典(第四版) 读书笔记
    一些编程试题
    Qt 对话框显示控制按钮
    vc++创建文件目录
    配置ubuntu虚拟机备忘
    Qt QThread 多线程使用
    Qt 程序等待多长时间执行Sleep
    Qt 数字和字符处理总结
    c++ 文件utf-8格式
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878800.html
Copyright © 2011-2022 走看看