EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery
时间:2019-11-12
本文章向大家介绍EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery,主要包括EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、目前EF Core的版本为V2.1
相比较EF Core v1.0 目前已经增加了不少功能。
EF Core除了常用的增删改模型操作,Sql语句在不少项目中是不能避免的。
在EF Core中上下文,可以返货DbConnection ,执行sql语句。这是最底层的操作方式,代码写起来还是挺多的。
初次之外 EF Core中还支持 FromSql,ExecuteSqlCommand 连个方法,用于更方便的执行Sql语句。
另外,目前版本的EF Core 不支持SqlQuery,但是我们可以自己扩展一个。坐等升级以后支持吧。
1.FromSql,执行列表查询
public static IQueryable<TEntity> FromSql<TEntity>([NotNullAttribute] this IQueryable<TEntity> source,
[NotParameterized] RawSqlString sql,
[NotNullAttribute] params object[] parameters) where TEntity : class;
这种方式,仅用于当前上线文中注册的 模型对象。
对于上下文DbSet<T>中没有定义的不起作用。
示例代码1:
//执行sql查询语句 FromSql() QLLB_SWXContext _Context = new QLLB_SWXContext(); string sql = "select * from Article where CategoryID=1;"; List<Article> list = _Context.Article.FromSql(sql).ToList(); foreach (var item in list) { Console.WriteLine(item.Title); }
示例代码2:视图中的查询
---创建视图,查询没有分配角色的菜单 create view view_NoRole as select * from Sys_Navigation where NavID not in ( select distinct NavID from Sys_Role_Nav )
//查询视图 string sql2 = "select * from view_NoRole"; List<SysNavigation> roleList = _Context.SysNavigation.FromSql(sql2).ToList(); foreach (var item in roleList) { Console.WriteLine(item.Title); }
2.ExecuteSqlCommand,执行Sql操作处理
QLLB_SWXContext _Context = new QLLB_SWXContext(); //执行数据操作sql,返回受影响的行数 string sql = "update Sys_Role set SortValue=1 ;"; int count = _Context.Database.ExecuteSqlCommand(sql); Console.WriteLine(count);
3.自定义SqlQuery,执行列表查询,在上线文中不存的对象。
示例代码1:
QLLB_SWXContext _Context = new QLLB_SWXContext(); //特别说明,自定义分装的不支持 单个值查询 //不支持object 查询 //自定义查询操作 SqlQuery string sql = "select sum(ViewCount)*1.11 as allCount from Article;"; TempData result = _Context.Database.SqlQuery<TempData>(sql).FirstOrDefault(); Console.WriteLine(result.AllCount);
对象定义
public class TempData { public int CategoryID { get; set; } public string Title { get; set; } public int ArtCount { get; set; } /// <summary> /// 求和结果 /// </summary> public decimal AllCount { get; set; } }
示例代码2:
执行视图查询:
--定义视图,文章分类和对应分类的文章数量 create view view_CateCount as select C.CategoryID,C.Title, ( select count(*) from Article where CategoryID=C.CategoryID ) as ArtCount from ArticleCategory C;
C#代码:
//组合查询 string sql2 = "select * from view_CateCount;"; List<TempData> tempList = _Context.Database.SqlQuery<TempData>(sql2).ToList(); foreach (var item in tempList) { Console.WriteLine(item.Title); }
SqlQuery扩展定义:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Reflection; using System.Text; namespace QL.Card.Entity { public static class DbContextExtensions { private static void CombineParams(ref DbCommand command, params object[] parameters) { if (parameters != null) { foreach (SqlParameter parameter in parameters) { if (!parameter.ParameterName.Contains("@")) parameter.ParameterName = $"@{parameter.ParameterName}"; command.Parameters.Add(parameter); } } } private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection dbConn, params object[] parameters) { DbConnection conn = facade.GetDbConnection(); dbConn = conn; conn.Open(); DbCommand cmd = conn.CreateCommand(); if (facade.IsSqlServer()) { cmd.CommandText = sql; CombineParams(ref cmd, parameters); } return cmd; } public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters) { DbCommand cmd = CreateCommand(facade, sql, out DbConnection conn, parameters); DbDataReader reader = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); reader.Close(); conn.Close(); return dt; } public static IEnumerable<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new() { DataTable dt = SqlQuery(facade, sql, parameters); return dt.ToEnumerable<T>(); } public static IEnumerable<T> ToEnumerable<T>(this DataTable dt) where T : class, new() { PropertyInfo[] propertyInfos = typeof(T).GetProperties(); T[] ts = new T[dt.Rows.Count]; int i = 0; foreach (DataRow row in dt.Rows) { T t = new T(); foreach (PropertyInfo p in propertyInfos) { if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value) p.SetValue(t, row[p.Name], null); } ts[i] = t; i++; } return ts; } } }
原文地址:https://www.cnblogs.com/zmsoftbj/p/11840947.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搭建一个低配版的Mock Server
- Nginx解决跨域资源问题:No 'Access-Control-Allow-Origin' header is present on the requested resource.
- Typecho 仿简书主题 时间轴归档页实现
- Typecho如何添加“编辑”当前文章按钮
- Flutter入门第二讲:项目运行,Hello world
- Flutter入门第一讲:环境搭建(mac os为例)
- 第12天:NLP补充——HMM(隐马尔科夫模型)
- android View事件分发实测
- LeetCode51|寻找旋转排序数组中的最小值
- Yapi 可视化接口平台安装实践
- LeetCode50|搜索旋转排序数组II
- LeetCode49|搜索旋转排序数组
- 第13天:NLP补充——RNN算法
- Android自定义跑马灯效果(适合任意布局)
- Handler Looper.prepareMainLooper();源码分析