.NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
2017-03-29 10:07
896 查看
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生。本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity Framework直接执行SQL语句或者存储过程的一些代码片段。具体请见以下正文:
{
var posts = context.Posts.SqlQuery("SELECT * FROM dbo.Posts").ToList();
}
这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。
注意:如果使用原始的SQL查询语句,请一定要注意处理SQL注入攻击相关的安全问题。
{
var posts = context.Posts.SqlQuery("dbo.spGetTopPosts").ToList();
}
这里的Posts必须是程序项目或者引用中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts
{
var postID = 99;
var posts = context.Posts.SqlQuery("dbo.spGetTopPosts @p0", postID).Single();
}
这里的Posts必须是程序项目或者引用中已声明的实体类,Single()是必须的,否则SQL查询将不会被执行。以上代码将执行存储过程: spGetTopPosts,并带一个传入参数postID
{
var postTitles = context.Database.SqlQuery<string>("SELECT Title FROM dbo.Posts").ToList();
}
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();
}
查询结果将是所有给定Post的Categories列表。
{
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
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(); } |
注意:如果使用原始的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(); } |
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(); } |
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); } |
以下则是一个使用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(); } |
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"); } |
本文翻译至: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查询语句或者执行过程
- .NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
- Mysql 将结果保存到文件 从文件中执行sql语句 记录操作过程(tee 命令的使用)
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- ado.net EF与ado.net区别比较、在EF中使用执行sql语句
- ado.net EF与ado.net区别比较、在EF中使用执行sql语句
- Entity Framework Code First执行SQL语句、视图及存储过程
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
- 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log
- EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
- 在SQL SERVER中定时执行SQL语句,或者存储过程. &sql server 自动执行存储过程
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
- 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
- SQL2000系统表、存储过程、函数的功能介绍及应用2009年01月21日 星期三 11:38虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL
- ADO.NET Entity Framework学习笔记 ESQL查询语句
- 关于PL/SQL中复杂的存储过程或者是函数等的查询==避免在PL/SQL当中写SQL语句查询存储过程或者是函数
- 使用log4net记录ibatis.net的SQL动态查询语句
- ASP.NET访问Oracle数据库 执行SQL语句过程