Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生。本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity Framework直接执行SQL语句或者存储过程的一些代码片段。具体请见以下正文:

1.使用SqlQuery在已知的实体上执行SQL查询语句

using (var context = new MyDBContext())
{
var posts = context.Posts.SqlQuery("SELECT * FROM dbo.Posts").ToList();
}
1
2
3
4
using (var context = new MyDBContext())
{
    var posts = context.Posts.SqlQuery("SELECT * FROM dbo.Posts").ToList();
}

这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。

注意:如果使用原始的SQL查询语句,请一定要注意处理SQL注入攻击相关的安全问题。

2.使用SqlQuery在已知的实体上执行存储过程

using (var context = new MyDBContext())
{
var posts = context.Posts.SqlQuery("dbo.spGetTopPosts").ToList();
}
1
2
3
4
using (var context = new MyDBContext())
{
    var posts = context.Posts.SqlQuery("dbo.spGetTopPosts").ToList();
}

这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts

3.使用SqlQuery在已知实体上执行带参数的存储过程

using (var context = new MyDBContext())
{
var postID = 99;
var posts = context.Posts.SqlQuery("dbo.spGetTopPosts @p0", postID).Single();
}
1
2
3
4
5
using (var context = new MyDBContext())
{
    var postID = 99;
    var posts = context.Posts.SqlQuery("dbo.spGetTopPosts @p0", postID).Single();
}

这里的Posts必须是程序项目或者引用中已声明的实体类,Single()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts,并带一个传入参数postID

4.使用SqlQuery在未知实体上执行SQL查询语句

using (var context = new MyDBContext())
{
var postTitles = context.Database.SqlQuery<string>("SELECT Title FROM dbo.Posts").ToList();
}
1
2
3
4
using (var context = new MyDBContext())
{
     var postTitles = context.Database.SqlQuery<string>("SELECT Title FROM dbo.Posts").ToList();
}

5.使用SqlQuery执行带参数的SQL查询语句

这是一种相比更安全的,可避免SQL注入攻击的执行原始SQL查询语句的方式

using (var context = new MyDBContext())
{
var userSuppliedAuthor = new SqlParameter("@author", "Adi");
context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @author", userSuppliedAuthor);
}
1
2
3
4
5
using (var context = new MyDBContext())
{
     var userSuppliedAuthor = new SqlParameter("@author", "Adi");
     context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @author", userSuppliedAuthor);
}

这里的SQL语句将查询Posts表,所以用到了typeof(Post)。如果JOIN语句来查询不同的两张表的话,就需要写一个内部类来返回SQL语句的查询结果。

以下则是一个使用JOIN连接查询的具体实例。

假如有Posts,Category,Posts_Category这三张表。Posts_Category是Post表中Post Id列以及Category表中Category Id列的映射表。如果我们执行如下的JOIN连接SQL查询:

internal class MappingData
{
public string CategoryTitle { get; set; }
public string PostTitle { get; set; }
public long? MappingId { get; set; }
}

using (var context = new MyDBContext())
{
var userSuppliedId = new SqlParameter("@PostId", PostID);
string sqlQuery = @"select c.Name CategoryTitle, pcm.Id MappingId, p.Title PostTitle from Posts_Categories pcm
join Categories c on pcm.CategoryId = c.Id
join Posts p on pcm.PostId = p.Id where pcm.PostId =@PostId";
var Results = db.Database.SqlQuery<MappingData>(sqlQuery,userSuppliedId).ToList();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
internal class MappingData
{
  public string CategoryTitle { get; set; }
  public string PostTitle { get; set; }
  public long? MappingId { get; set; }
}
 
using (var context = new MyDBContext())
{
var userSuppliedId = new SqlParameter("@PostId", PostID);
string sqlQuery = @"select c.Name CategoryTitle, pcm.Id MappingId, p.Title PostTitle from Posts_Categories pcm
                                join Categories c on pcm.CategoryId = c.Id
                                join Posts p on pcm.PostId = p.Id where pcm.PostId =@PostId";
var Results = db.Database.SqlQuery<MappingData>(sqlQuery,userSuppliedId).ToList();
}

查询结果将是所有给定Post的Categories列表。

6.使用ExcuteSqlCommand在未知实体上执行更新操作

using (var context = new MyDBContext())
{
context.Database.ExecuteSqlCommand(
"UPDATE dbo.Posts SET Title = 'Updated Title' WHERE PostID = 99");
}
1
2
3
4
5
using (var context = new MyDBContext())
{
      context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Posts SET Title = 'Updated Title' WHERE PostID = 99");
}

总结:以上的SqlQuery和ExecuteSqlCommand方法均是DbContext对应数据库实例的方法,如果是执行原始的未经处理的SQL语句时,请一定注意SQL注入攻击等安全性问题!!!
本文翻译至:http://adicodes.com/entity-framework-raw-sql-queries-and-stored-procedure-execution/

出处来自https://www.ofnhkb1.com/chenmo/128.html

.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程的更多相关文章

  1. C# EF使用SqlQuery直接操作SQL查询语句或者执行过程

    Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...

  2. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  3. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  4. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  5. ASP.NET Core 开发 - Entity Framework (EF) Core

    EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...

  6. Entity Framework (EF) Core工具创建一对多和多对多的关系

     一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...

  7. [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations

    本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...

  8. ADO.NET Entity Framework(EF)

    ylbtech-Miscellaneos: ADO.NET Entity Framework(EF) A,返回顶部 1, ADO.NET Entity Framework 是微软以 ADO.NET 为 ...

  9. ORM之Entity Framework(EF)

    ORM之Entity Framework(EF) 一.下载安装: nuget 搜索Entity Framework安装 EntityFramework.Extension是个扩展库根据需要安装 二.使 ...

随机推荐

  1. vim中翻页的命令

      整页翻页 ctrl-f ctrl-b f就是forword b就是backward 翻半页 ctrl-d ctlr-u d=down u=up 滚一行 ctrl-e ctrl-y zz 让光标所杂 ...

  2. Python: Soft_max 分类器

    我们能够建立例如以下的loss function: Li=−log(pyi)=−log⎛⎝efyi∑jefj⎞⎠ L=1N∑iLi+12λ∑k∑lW2k,l 以下我们推导loss对W,b的偏导数,我们 ...

  3. Linux下 iptables防火墙 放开相关port 拒绝相关port 及查看已放开port

    我用的是fedora 14 1. 查看iptables 防火墙已经开启的port:/etc/init.d/iptables status [root@hzswtb2-mpc ~]#/etc/rc.d/ ...

  4. Sphinx高亮显示关键字

    选取程序中使用的一部分代码: public function buildExcerptRows($ids) { $options = array( 'before_match' => '< ...

  5. python 中写hive 脚本

    1.直接执行.sql脚本 import numpy as np import pandas as pd import lightgbm as lgb from pandas import DataFr ...

  6. Mysql 修改数据库,mysql修改表类型,Mysql增加表字段,Mysql删除表字段,Mysql修改字段名,Mysql修改字段排列顺序,Mysql修改表名

    对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表.这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载 ...

  7. mysql string types ---- mysql 字符类型详解

    一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...

  8. Redhat7 Mesos安装

    $ sudo yum install -y tar wget git 1. 手工安装mavenwget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3 ...

  9. jquery的商品首页

    js代码: $(function() { /*新闻滚动*/ var $this = $('.scrollNews'); var scrollTimer; $this.hover(function () ...

  10. 兼容浏览器的min-height和min-width

    http://www.cnblogs.com/pigtail/archive/2012/06/28/2568646.html CSS 子元素宽度变宽时,如何撑开父元素https://zhidao.ba ...