C#EF使用SqlQuery直接操作SQL查询语句或者存储过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#EF使⽤SqlQuery直接操作SQL查询语句或者存储过程
Entity Framework是微软出品的⾼级ORM框架,⼤多数.NET开发者对这个ORM框架应该不会陌⽣。
本⽂主要罗列
在.NET(/WINFORM)应⽤程序开发中使⽤Entity Framework直接执⾏SQL语句或者存储过程的⼀些代码⽚段。
具体请见以下正⽂:
1.使⽤SqlQuery在已知的实体上执⾏SQL查询语句
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();
}
这⾥的Posts必须是程序项⽬或者引⽤中已声明的实体类,ToList()是必须的,否则SQL查询将不会被执⾏。
以上代码将执⾏存储过程: spGetTopPosts
3.使⽤SqlQuery在已知实体上执⾏带参数的存储过程
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();
}
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);
}
这⾥的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 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");
}
总结:以上的SqlQuery和ExecuteSqlCommand⽅法均是DbContext对应数据库实例的⽅法,如果是执⾏原始的未经处理的SQL语句时,请⼀定注意SQL注⼊攻击等安全性问题
7. 存储过程
7.1 ⽰例(1)
create proc pro_Add
@i int,
@j int,
@he int output
as
set@he=@i+@j
System.Data.SqlClient.SqlParameter[] parameters2 = {
new System.Data.SqlClient.SqlParameter("@i",100),
new System.Data.SqlClient.SqlParameter("@j",100),
new System.Data.SqlClient.SqlParameter("@he", System.Data.SqlDbType.Int)
};
parameters2[2].Direction = System.Data.ParameterDirection.Output;
mon.DbCommand cmd = DbContext.Database.Connection.CreateCommand();
mandText = "pro_Add";
mandType = mandType.StoredProcedure;
cmd.Parameters.AddRange(parameters2);
if (cmd.Connection.State != System.Data.ConnectionState.Open)
cmd.Connection.Open();
cmd.ExecuteNonQuery();
string output1 = parameters2[2].Value.ToString();
cmd.Connection.Close();
string output2 = parameters2[2].Value.ToString();
7.2 ⽰例(2)
create proc pro_Add
@i int,
@j int,
@he int output
as
set@he=@i+@j
select@he
go
System.Data.SqlClient.SqlParameter[] parameters = {
new System.Data.SqlClient.SqlParameter("@i",100),
new System.Data.SqlClient.SqlParameter("@j",100),
new System.Data.SqlClient.SqlParameter("@he", System.Data.SqlDbType.Int)
};
parameters[2].Direction = System.Data.ParameterDirection.Output;
var slt = this.DbContext.Database.SqlQuery<int>("exec pro_Add @i,@j,@he output", parameters);
slt.ToList();
int AllCount = Int32.Parse(parameters[2].Value.ToString());
8. 执⾏SQL语句
//⽰例1.
System.Data.SqlClient.SqlParameter[] parameters = { };
var slt = this.DbContext.Database.SqlQuery(typeof(BadWordFilter),"select top 100 * from BadWordFilter", parameters);
foreach( var item in slt )
{
BadWordFilter badword = item as BadWordFilter;
string word = badword.badWordContent;
}
//⽰例2.
System.Data.SqlClient.SqlParameter[] parameters = { new System.Data.SqlClient.SqlParameter("@id",ID)};
var slt = this.DbContext.Database.SqlQuery<BadWordFilter>("select top 1 * from BadWordFilter where badWordID=@id", parameters); BadWordFilter item = slt.First();
//⽰例3.
System.Data.SqlClient.SqlParameter[] parameters = { };
var slt = this.DbContext.Database.SqlQuery<int>("select count(*) from BadWordFilter", parameters);
int AllCount = slt.First();。