#region 01-封装增删改或其他的方法
/// <summary>
/// 封装增删改或其他的方法
/// </summary>
/// <param name="db">数据库连接上下文</param>
/// <param name="sql">数据库sql语句</param>
/// <param name="paras">参数化参数</param>
/// <returns></returns>
public static int ExecuteSqlCommand(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.ExecuteSqlCommand(sql, paras);
}
#endregion
#region 02-执行查询操作(结果为集合)
public static List<T> SqlQueryList<T>(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery<T>(sql, paras).ToList();
}
#endregion
#region 03-执行查询操作(结果为单一实体)
public static T SqlQuery<T>(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
}
#endregion
1 2 3 4 5 |
using (var context = new MyDBContext()) { var userSuppliedAuthor = new SqlParameter("@author", "Adi"); context.Database.ExecuteSqlCommand("SELECT * FROM dbo.Posts WHERE Author = @author", userSuppliedAuthor); } |
这样是防止SQL注入,这种EF 执行SQL的性能比原生高
var list = db.ZQ_TestEF.SqlQuery("select * from ZQ_TestEF").ToList(); // ZQ_TestEF 是类,不是表
IList<ZQ_TestEF> list2 = db.ZQ_TestEF.SqlQuery("select * from dbo.ZQ_TestEF").ToList();
以下则是一个使用JOIN连接查询的具体实例。
假如有Posts,Category,Posts_Category这三张表。Posts_Category是Post表中Post Id列以及Category表中Category Id列的映射表。如果我们执行如下的JOIN连接SQL查询:
这种写法,会生成实体类
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(); |