一、目前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,执行列表查询

  1. public static IQueryable<TEntity> FromSql<TEntity>([NotNullAttribute] this IQueryable<TEntity> source,
    [NotParameterized] RawSqlString sql,
    [NotNullAttribute] params object[] parameters) where TEntity : class;

这种方式,仅用于当前上线文中注册的 模型对象。

对于上下文DbSet<T>中没有定义的不起作用。

示例代码1:

  1. //执行sql查询语句 FromSql()
  2. QLLB_SWXContext _Context = new QLLB_SWXContext();
  3. string sql = "select * from Article where CategoryID=1;";
  4. List<Article> list = _Context.Article.FromSql(sql).ToList();
  5. foreach (var item in list)
  6. {
  7. Console.WriteLine(item.Title);
  8. }

示例代码2:视图中的查询

  1. ---创建视图,查询没有分配角色的菜单
  2. create view view_NoRole
  3. as
  4. select * from Sys_Navigation
  5. where NavID not in (
  6. select distinct NavID from Sys_Role_Nav
  7. )
  1. //查询视图
  2. string sql2 = "select * from view_NoRole";
  3. List<SysNavigation> roleList = _Context.SysNavigation.FromSql(sql2).ToList();
  4. foreach (var item in roleList)
  5. {
  6. Console.WriteLine(item.Title);
  7. }

2.ExecuteSqlCommand,执行Sql操作处理

  1. QLLB_SWXContext _Context = new QLLB_SWXContext();
  2. //执行数据操作sql,返回受影响的行数
  3. string sql = "update Sys_Role set SortValue=1 ;";
  4. int count = _Context.Database.ExecuteSqlCommand(sql);
  5. Console.WriteLine(count);

3.自定义SqlQuery,执行列表查询,在上线文中不存的对象。

示例代码1:

  1. QLLB_SWXContext _Context = new QLLB_SWXContext();
  2. //特别说明,自定义分装的不支持 单个值查询
  3. //不支持object 查询
  4. //自定义查询操作 SqlQuery
  5. string sql = "select sum(ViewCount)*1.11 as allCount from Article;";
  6. TempData result = _Context.Database.SqlQuery<TempData>(sql).FirstOrDefault();
  7. Console.WriteLine(result.AllCount);

对象定义

  1. public class TempData
  2. {
  3. public int CategoryID { get; set; }
  4. public string Title { get; set; }
  5. public int ArtCount { get; set; }
  6. /// <summary>
  7. /// 求和结果
  8. /// </summary>
  9. public decimal AllCount { get; set; }
  10. }

示例代码2:

执行视图查询:

  1. --定义视图,文章分类和对应分类的文章数量
  2. create view view_CateCount
  3. as
  4. select C.CategoryID,C.Title, (
  5. select count(*) from Article where CategoryID=C.CategoryID
  6. ) as ArtCount from ArticleCategory C;

C#代码:

  1. //组合查询
  2. string sql2 = "select * from view_CateCount;";
  3. List<TempData> tempList = _Context.Database.SqlQuery<TempData>(sql2).ToList();
  4. foreach (var item in tempList)
  5. {
  6. Console.WriteLine(item.Title);
  7. }

SqlQuery扩展定义:

  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.Infrastructure;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Data.Common;
  7. using System.Data.SqlClient;
  8. using System.Reflection;
  9. using System.Text;
  10.  
  11. namespace QL.Card.Entity
  12. {
  13. public static class DbContextExtensions
  14. {
  15. private static void CombineParams(ref DbCommand command, params object[] parameters)
  16. {
  17. if (parameters != null)
  18. {
  19. foreach (SqlParameter parameter in parameters)
  20. {
  21. if (!parameter.ParameterName.Contains("@"))
  22. parameter.ParameterName = $"@{parameter.ParameterName}";
  23. command.Parameters.Add(parameter);
  24. }
  25. }
  26. }
  27.  
  28. private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection dbConn, params object[] parameters)
  29. {
  30. DbConnection conn = facade.GetDbConnection();
  31. dbConn = conn;
  32. conn.Open();
  33. DbCommand cmd = conn.CreateCommand();
  34. if (facade.IsSqlServer())
  35. {
  36. cmd.CommandText = sql;
  37. CombineParams(ref cmd, parameters);
  38. }
  39. return cmd;
  40. }
  41.  
  42. public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
  43. {
  44. DbCommand cmd = CreateCommand(facade, sql, out DbConnection conn, parameters);
  45. DbDataReader reader = cmd.ExecuteReader();
  46. DataTable dt = new DataTable();
  47. dt.Load(reader);
  48. reader.Close();
  49. conn.Close();
  50. return dt;
  51. }
  52.  
  53. public static IEnumerable<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
  54. {
  55. DataTable dt = SqlQuery(facade, sql, parameters);
  56. return dt.ToEnumerable<T>();
  57. }
  58.  
  59. public static IEnumerable<T> ToEnumerable<T>(this DataTable dt) where T : class, new()
  60. {
  61. PropertyInfo[] propertyInfos = typeof(T).GetProperties();
  62. T[] ts = new T[dt.Rows.Count];
  63. int i = ;
  64. foreach (DataRow row in dt.Rows)
  65. {
  66. T t = new T();
  67. foreach (PropertyInfo p in propertyInfos)
  68. {
  69. if (dt.Columns.IndexOf(p.Name) != - && row[p.Name] != DBNull.Value)
  70. p.SetValue(t, row[p.Name], null);
  71. }
  72. ts[i] = t;
  73. i++;
  74. }
  75. return ts;
  76. }
  77. }
  78. }

更多:

.NetCore中EFCore的使用整理

.NetCore中EFCore的使用整理(二)-关联表查询

.NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql

EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery的更多相关文章

  1. Asp.Net MVC EF之一:使用Database类在EF框架中执行Sql语句

    引言 从EF6开始,增加了DateBase类,他通过从 DbContext 对象获取此类的实例.可用于管理支持数据库上下文或连接的实际数据库.这包括创建.删除和检查数据库的存在. 在6以前,我们使用E ...

  2. Entity Framework中执行Sql语句

           如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本).        EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...

  3. 在EF中执行SQL语句(转载)

    在EF中执行SQL语句   你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...

  4. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  5. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  6. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  7. [转]在EntityFramework6中执行SQL语句

    本文转自:http://www.cnblogs.com/wujingtao/p/5412329.html 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有 ...

  8. 在EntityFramework6中执行SQL语句

    在EntityFramework6中执行SQL语句 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语 ...

  9. 在EntityFramework6中执行SQL语句【转】

    在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有操作.这一节我来介绍一下如何使用在EF6中执行SQL语句. 你可能要问,我用EF不就为了避免写SQL吗?如 ...

随机推荐

  1. js中时间大小的比较

    今天在前台做到一个需要比较两个日期大小的地方,乍一看,发现一个比较奇怪地地方: var t1 = new Date(2018,1,1), t2 = new Date(2018,1,1); consol ...

  2. glusterfs分布式复制扩容卷以及平衡卷

    随着数据量的增长,需要扩容满足使用.今天测试下glusterfs磁盘扩容的具体步骤 1.扩容 之前用的2台计算机的分布式复制卷.需要同时之两个服务器增加一块磁盘并格式化,挂载并扩容 热添加磁盘 ech ...

  3. IE8兼容问题

    最近做的网站,需要兼容IE8,在这里记录一下,碰到的问题,方便以后查看补充 1.CSS选择器nth-child 不兼容 ul li:nth-child(2){ background-image: ur ...

  4. JS uint8Array转String

    Uint8Array转字符串 function Uint8ArrayToString(fileData){ var dataString = ""; ; i < fileDa ...

  5. Ajax+PHP实现异步上传多张图片

    Ajax+PHP实现异步上传多张图片 HTML代码 <!-- date: 2018-04-27 13:46:55 author: 王召波 descride: 多张图片上传 --> < ...

  6. 2018-03-11 20165235 祁瑛 Java第二周考试总结

    20165235 祁瑛 Java第二周考试总结 课后习题p16 代码编写 class Person { void speakHello (){ System.out.print("nin h ...

  7. 5、Qt Project之键盘数据监控

    键盘数据监控: 同样的,键盘的检测和鼠标的情形很类似,都是以QWidget为基类的工程 Step1:在UI设计中添加该模块需要使用的相关组件,如下所示: <width>141</wi ...

  8. L - Ray in the tube Gym - 101911L (暴力)

    ---恢复内容开始--- You are given a tube which is reflective inside represented as two non-coinciding, but ...

  9. Linux ubantu中安装虚拟/使用环境virtualenv以及python flask框架

    今天学习了python flask框架的安装过程以及使用案例,感觉网上讲的东西都没有从我们这种初学者的角度去考虑(哈哈),最后还是奉上心得: 1.安装virtualenv $ sudo apt-get ...

  10. linux6.8安装docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...