使用实体框架返回数据表
目录
背景
扩展方式
实体框架(Entity Framework)
实体框架核心(Entity Framework Core)
使用扩展方法
使用常规查询
使用参数化查询
不同数据库的DbParameter名称
将源代码与SQL-Server Db一起使用
Db对象
解决方案和项目
- 下载源8.9 KB
背景
在应用程序的特定情况下,我们必须以DataTable对象的形式获取结果。该应用程序正在使用Oracle数据库和Entity Framework EDMX。我们必须使用现有的数据库上下文实例从未映射的共享视图中选择数据。为此,我实际上为DbContext对象编写了一些扩展方法,如下所述。
扩展方式
我们将创建DbContext同时考虑Entity Framework和Entity Framework Core的扩展方法。扩展方法将通过以下方式调用:
- SQL查询字符串
- 可选DbParameter对象,如果使用参数化查询
让我们开始编写代码。
实体框架(Entity Framework)
using System.Data;
using System.Data.Common;
using System.Data.Entity;public static class DbContextExtensions
{/** needOnly EntityFramework*/public static DataTable DataTable(this DbContext context, string sqlQuery, params DbParameter[] parameters){DataTable dataTable = new DataTable();DbConnection connection = context.Database.Connection;DbProviderFactory dbFactory = DbProviderFactories.GetFactory(connection);using (var cmd = dbFactory.CreateCommand()){cmd.Connection = connection;cmd.CommandType = CommandType.Text;cmd.CommandText = sqlQuery;if (parameters != null){foreach (var item in parameters){cmd.Parameters.Add(item);}}using (DbDataAdapter adapter = dbFactory.CreateDataAdapter()){adapter.SelectCommand = cmd;adapter.Fill(dataTable);}}return dataTable;}
}
实体框架核心(Entity Framework Core)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.Common;
using Microsoft.EntityFrameworkCore;public static class DbContextExtensions
{/** needMicrosoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.Relational*/public static DataTable DataTable(this DbContext context, string sqlQuery, params DbParameter[] parameters){DataTable dataTable = new DataTable();DbConnection connection = context.Database.GetDbConnection();DbProviderFactory dbFactory = DbProviderFactories.GetFactory(connection);using (var cmd = dbFactory.CreateCommand()){cmd.Connection = connection;cmd.CommandType = CommandType.Text;cmd.CommandText = sqlQuery;if (parameters != null){foreach (var item in parameters){cmd.Parameters.Add(item);}}using (DbDataAdapter adapter = dbFactory.CreateDataAdapter()){adapter.SelectCommand = cmd;adapter.Fill(dataTable);}}return dataTable;}
}
我试图将代码放到一个普通项目中,这实际上取决于Microsoft.EntityFrameworkCore.Relational。默认情况下,它会自动包含任何提供程序DLL,比如Microsoft.EntityFrameworkCore.SqlServer。
使用扩展方法
使用常规查询
var db = new MopDb();
DataTable allUser = db.DataTable("SELECT * FROM [dbo].[tbl_test_role]");
使用参数化查询
var db = new MopDb();/*stored procedure*/
DataTable searchUser = db.DataTable("EXEC sp_test_role @name = @paramName",new SqlParameter("paramName", SqlDbType.NVarChar) { Value = "sa" }
);/*select query*/
DataTable likeUser = db.DataTable("SELECT * FROM [dbo].[tbl_test_role] WHERE [name] LIKE '%' + @paramName +'%'",new SqlParameter("paramName", SqlDbType.NVarChar) { Value = "a" }
);
我们正在执行存储过程和查询,我相信函数也将起作用。
不同数据库的DbParameter名称
- SqlServer:SqlParameter
- Oracle:OracleParameter
- MySql的:MySqlParameter
- PostgreSQL的:NpgsqlParameter
将源代码与SQL-Server Db一起使用
Db对象
创建Db对象
CREATE TABLE [dbo].[tbl_test_role] ([id] INT IDENTITY (1, 1) NOT NULL,[name] NVARCHAR (50) NOT NULL,[details] NVARCHAR (150) NULL,PRIMARY KEY CLUSTERED ([id] ASC)
);
INSERT INTO [dbo].[tbl_test_role] (name)
VALUES ('admin'), ('sa'), ('user');CREATE PROCEDURE sp_test_role @name nvarchar(30)
AS
BEGINSELECT * FROM [dbo].[tbl_test_role]WHERE [name] = @name;
END;
如果需要,可以删除Db对象
DROP TABLE [dbo].[tbl_test_role];
DROP PROCEDURE sp_test_role;
解决方案和项目
这是Visual Studio 2017解决方案:
- WithEf 是.NET Framework 4.5
- WithEfCore 是.NET Core 2.2
更改连接字符串
WithEf中的App.config:
<connectionStrings><add name="MopDbConnection" connectionString="Data Source=10.10.15.13\DB002;Initial Catalog=TESTDB; PASSWORD=dhaka; USER ID=FSTEST;"providerName="System.Data.SqlClient" />
</connectionStrings>
WithEfCore中的appsettings.json:
"ConnectionStrings": {"MopDbConnection": "server=10.10.15.13\\DB002;database=TESTDB;user id=FSTEST;password=dhaka"
}
使用实体框架返回数据表相关推荐
- MVC之实体框架(数据持久化框架)EntityFrameWork(EF)
EF - EntityFrameWork 中文名:实体框架(数据持久化框架) 1.使用EF查询(Linq to EF) 1.1使用标准查询运算符来查询 OumindBlogEntities db = ...
- web元件库、axure元件库、通用元件库、常用web组件、常用表单、框架、数据表单、导航栏、边框、图标、列表、日期时间选择器、评分组件、穿梭框、输入框、步骤条、图表组件、数据可视化、后台模板、时间轴
web元件库.axure元件库.通用元件库.常用web组件.常用表单.框架.数据表单.导航栏.边框.图标.列表.日期时间选择器.评分组件.穿梭框.输入框.步骤条.图表组件.数据可视化.后台模板.时间轴 ...
- web元件库、axure元件库、元件库、web组件、控件、表单、框架、数据表单、导航栏、边框、图标、列表、日期时间选择器、评分组件、穿梭框、输入框、步骤条、图表组件、数据可视化、后台模板、时间轴
web元件库.axure元件库.通用元件库.web组件.控件.表单.框架.数据表单.导航栏.边框.图标.列表.日期时间选择器.评分组件.穿梭框.输入框.步骤条.图表组件.数据可视化.后台模板.时间轴. ...
- 实体类和数据表的映射异常(XXX is not mapping[ ])
在使用SSH框架开发过程,使用hibernate框架提供的工具类实现与数据库数据交互,在执行cmd操作时,如果出现以下异常: org.hibernate.hql.ast.QuerySyntaxExce ...
- LayUI框架table数据表渲染不适配苹果手机详解!!
前提: 接手公司后台管理系统!老大说要适配手机端!在浏览器上调试好像苹果和android的手机都是正常的!实际在真机上面android手机是正常的,而在ios手机上table数据表左右,上下都滑动不了 ...
- spring jdbctemplate 实体列与数据表列 查询
目录 1. BeanPropertyRowMapper接口 2. 创建mapper类实现接口 1. BeanPropertyRowMapper接口 当我查询时,使用下面的接口,原理是根据实体类的字段名 ...
- Columns函数:返回数据表区域的总列数。
COLUMNS( $ C: $ H) 返回结果为6 返回区域的总列数,利用该技巧可以避免人为对区域列数的手工计算,将直接返回指定区域中最后一列的序号
- 只返回数据表的部分字段(不建类)
最简单的是: var vresult= result.Select(u => new { ID = u.id, Guid = u.Guid.Trim(), addTime = u.addTime ...
- 怎么创建数据表的实体类和业务类_微服务项目第13天:商品分类业务的实现
今天是刘小爱自学Java的第143天. 感谢你的观看,谢谢你. 学习计划安排如下: 商品分类业务的初步实现. 数据模型的分析:数据表字段的设计,Java中对应的实体类,前端页面vue组件. 业务模型的 ...
最新文章
- 杭电acm1004java答案_水过杭电OJ hdu1004
- python中 pip的安装方法
- 【Network Security!】xrdp+vnc4server+xfce4远程管理Ubuntu服务器桌面
- 深度学习基础(十二)—— ReLU vs PReLU
- 注意稳住或慢抬离合,给车辆一些缓冲,才能平顺起步。抬得太快,
- kafka maven没有下载_Kafka 系列(三)——Kafka 生产者详解
- 大河抽奖盲盒运营版 1.9.12开源版
- MATLAB——PLOT绘图
- Java Integer.compareTo()比较大小
- fast角点检测 java_opencv3_java 图像的角点检测DetectConers goodFeaturesToTrack
- 判断可逆素数的c语言程序,C语言可逆素数教程
- HowNet文件介绍
- ios android 系统占用空间,iOS 系统占用了 20G 储存空间?别担心,教你快速解决!...
- 悦刻电子烟一代二代三代四代区别是什么?
- ZOJ - 3939
- 优秀logo,最基础的设计技巧(一)
- 信息系统典型的开发架构
- 台电tbook10s删除安卓系统_Andriod系统体验 简洁流畅_台电 TBook 10_平板电脑评测-中关村在线...
- 关于Linux的介绍与安装
- 【Trie图】Hiho4_Hihocoder