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方法加载相关实体。

  • 相关阅读:
    JQuery封装的ajax
    DOM节点操作
    ES6中的let和const
    CSS cursor 属性
    ui-router 视图嵌套时指定二级视图显示默认页面
    数组去重的几种方法
    basic_consume() got multiple values for keyword argument 'queue'
    perl改造成bash---结果写入xml
    springmvc 启动报 java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;
    web项目部署名和项目名不一致
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878800.html
Copyright © 2011-2022 走看看