.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生。本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity Framework直接执行SQL语句或者存储过程的一些代码片段。具体请见以下正文:
1.使用SqlQuery在已知的实体上执行SQL查询语句
{
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在已知的实体上执行存储过程
{
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在已知实体上执行带参数的存储过程
{
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查询语句
{
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查询语句的方式
{
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查询:
{
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在未知实体上执行更新操作
{
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查询语句或者执行过程的更多相关文章
- C# EF使用SqlQuery直接操作SQL查询语句或者执行过程
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...
- 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 ...
- 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 ...
- Entity Framework (EF) Core工具创建一对多和多对多的关系
一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...
- [转]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 ...
- ADO.NET Entity Framework(EF)
ylbtech-Miscellaneos: ADO.NET Entity Framework(EF) A,返回顶部 1, ADO.NET Entity Framework 是微软以 ADO.NET 为 ...
- ORM之Entity Framework(EF)
ORM之Entity Framework(EF) 一.下载安装: nuget 搜索Entity Framework安装 EntityFramework.Extension是个扩展库根据需要安装 二.使 ...
随机推荐
- Python dict的特点
dict的特点 1:查找速度快 2:浪费空间 3:key不可以重复,且不可变 4:数据无序排放 dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样.而list的 ...
- [Done]ibatis/mybatis: java.lang.NoSuchMethodException
异常描述: Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating interface cn. ...
- CentOS7——gitlab本地git仓库搭建 以及web hook配置
整个搭建用的都是各种默认设置,所以没有用到高深的的东西,比较简单,比较傻瓜式,这篇也仅仅是一个入门. 另外本文具有时效性,浏览本文请注意发表时间,为防止过时产生误导,本文尽量把 “如何得知应该这样做” ...
- JDBC 事务(一) 隔离级别
public class TxTest { public static void main(String[] args) throws SQLException { test(); ...
- LaTeX 中文段首空格问题
一般用 “\\”或者回车可以使得下一段段首空两格,但是对于第一段就不行了. 解决办法: 加一个\usepackage{indentfirst}就可以
- SDK Manager 闪退的解决方式
打开电脑的执行 也就是win+R键 然后在命令行里面打上android即可了
- struts2 的国际化
一.使用步骤 1)写资源文件,资源文件名命名规范和之前的讲的一致,有疑问请参考java开发中国际化 2)配置,在 struts.xml 中使用常量进行加载 struts.custom.i18n.res ...
- Informix ConnetionString Pool Size
Database=aa;Host=127.0.0.1;Server=ol_svr_custom;Service=9000;Protocol=onsoctcp;UID=informix;Password ...
- Qt 积累
总结(-) 1> 定时器的使用 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(u ...
- Linux安装Scala步骤
1.到官方下载tgz的安装包. http://www.scala-lang.org/download/ 注意:在最下面的Other Resources中 2.下载后将压缩包放在/usr/local目录 ...