微软的EF至今已到了EF6版本了,但是,不知道微软咋想的,至今也不支持直接从数据库获取一张数据表DataTable,但这个DataTable在许多情况下还是比确定的实体化类更方便好使,这里,我仿照微软的书写习惯,扩展了一个这样的方法,同时,由于EF内部的原因,每一个声明出的System.Data.Common.DbParameter型对象都无法重复使用,为了方便,同时为System.Data.SqlClient.SqlParameter[]型的对象扩展了一个克隆的方法,不多说了,直接上代码吧

public static class Extension
{
/// <summary>
/// 获取DataSet的方法
/// </summary>
/// <param name="db"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="objs"></param>
/// <returns></returns>
public static DataSet GetDataSet(this System.Data.Entity.Database db, System.Data.CommandType commandType, string commandText, params System.Data.Common.DbParameter[] parameterValues)
{
System.Data.Common.DbConnection con = db.Connection;//DbConnection是SqlConnection的父类(抽象型类),其余ADO对象与此情况类同 using (System.Data.Common.DbCommand cmd = con.CreateCommand())//DbCommand是个抽象类,C#为了让接口能正常运行,就设置了这样一个方法来生成接口对象,也算是无奈情况下的一个特例吧,毕竟不能new,却还必须得用
{
cmd.CommandText = commandText;
cmd.CommandType = commandType;
cmd.Parameters.AddRange(parameterValues); DataSet ds = new DataSet();
using (var sda = System.Data.Common.DbProviderFactories.GetFactory(con).CreateDataAdapter())
{
sda.SelectCommand = cmd;
sda.Fill(ds);
} return ds;
} } /// <summary>
/// 克隆出一个新的参数数组,新被克隆者仅仅是参数名和参数值相同而又,其本质是一个新的对象,这是因为为EF扩展的GetDataSet()中的参数无法重复使用才又扩展出这样一个方法来方便使用
/// </summary>
/// <param name="paras"></param>
public static List<System.Data.SqlClient.SqlParameter> Clone(this List<System.Data.SqlClient.SqlParameter> paras)
{
var pms = new List<System.Data.SqlClient.SqlParameter>();
foreach (var x in paras)
{
pms.Add(new System.Data.SqlClient.SqlParameter(x.ParameterName, x.Value));
}
return pms;
} }

用法如下:

using (Models.db_zhikong db = new Models.db_zhikong())
{
var sql = "select * from ft_user where username=@username and staff_name like @staff_name";
var ds = db.Database.GetDataSet(CommandType.Text, sql, new System.Data.Common.DbParameter[]
{
new System.Data.SqlClient.SqlParameter("@username","houfb"),  //注:System.Data.Common.DbParameter是System.Data.SqlClient.SqlParameter的抽象父类
new System.Data.SqlClient.SqlParameter("@staff_name","%飞彪%"),
});
var row_count = ds.Tables[].Rows.Count;
}

EF获取DataTable的扩展方法GetDataSet的更多相关文章

  1. (原创)[C#] DataTable排序扩展方法

    一,前言 DataTable的应用极其广泛,对DataTable进行排序也有很多方式,每种的实现方式都不难,但是使用起来却比较繁琐,所以本人便写了一个扩展方法,专门对DataTable进行操作. 本篇 ...

  2. 在使用EF时调用DBFUNCTION扩展方法时,发生ENTITYCOMMANDEXECUTIONEXCEPTION 异常的解决办法

    System.Data.Entity.Core.EntityCommandExecutionException : An error occurred while executing the comm ...

  3. WebAPi添加常用扩展方法及思维发散

    前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...

  4. 译:泛型List集合转化为DateTable的扩展方法

    译文出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是 ...

  5. EF大数据批量处理 EntityFrameWork下增加扩展方法

    为EF操作方法添加扩展方法 BulkInsert 大致设计方式为 通过当前DbContext 获取当前连接字符串,调用连接字符串获取当前实体的所有字段及字段属性,映射到DataTable中 在调用Sy ...

  6. DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()

    /// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <sum ...

  7. C#中DataTable与实体集合通用转换(使用扩展方法)

    本案例提供了:把DataRow转换为单个实体.dataTable转换为List泛型支持时间格式转换. 下文的方法都是扩展方法.扩展方法要求写在静态类中,方法也要静态. 它必须在一个非嵌套.非泛型的静态 ...

  8. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  9. C# DataTable扩展方法

    在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...

随机推荐

  1. 获取一个整数所有的质因数(C语言实现)

    一.题目要求 1. 用户输入任意一个整数,要求程序输出此整数所有的质因数: 2. 用户可以反复输入,直至输入字符'q'退出程序. 二.分析 质因数的概念大家可以问度娘. 题目关键有几个要点,分析透了这 ...

  2. WinForm控件之【Button】

    基本介绍 普通按钮大部分情况下用作页面对某系列操作后的提交确认,应用较为广泛,在winfrom控件当中使用设置都相对的简单. 常设置属性.事件 Image:控件上显示的图片: Enabled  :指示 ...

  3. 【POJ - 1995】Raising Modulo Numbers(快速幂)

    -->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1  B1 A2  B2 A3  B3 ......... AH  ...

  4. (转)android自定义控件

    原帖地址:http://my.oschina.net/wangjunhe/blog/99764 创建新的控件: 作为一个有创意的开发者,你经常会遇到安卓原生控件无法满足你的需求. 为了优化你的界面和工 ...

  5. HelloDjango 启动!免费带你学Django全栈!

    欢迎 追梦 入伙 HelloGitHub-Team,同时为我们带来了完全免费的 HelloDjango 系列教程,全网首发于 HelloGitHub 公众号.让想你的系列文章被跟多人看到,那就来加入我 ...

  6. GIL与异步回调

    07.07自我总结 一.GIL 1.概念 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁 2.带来的问题 首先必须明确执行一个py文件,分为三个步骤 从硬盘加载Python解释器到内 ...

  7. sql format 格式化数字(前面补0)

    将一个数字例如33,或1使用t-sql语句转换成033或001 以下是详细分析: 1.select power(10,3)得到1000 2.select cast(1000+33 as varchar ...

  8. 用 | 和 & 简化查询

    利用"|"和"&"简化查询 1.多个字段相同查询条件下用"&"处理 例如该情况: $model = M('Test'); $ ...

  9. 名称空间(name space)

    名称空间(name space) 函数编程中,有一个挥之不去的问题:变量名的定义. 我们知道,在相同的作用域内不能出现两个相同的变量名,否则前者被后者覆盖 我们还知道,局部变量的名字可以与全局变量的名 ...

  10. Linux学习笔记05之网络基础知识

    一.OSI参考模型:适用于所有网络,现有模型,后有协议 1.应用层:应用程序.用户接口 2.表示层:编码转换.压缩.解压.加密等 3.会话层:建立.维护.拆除会话 4.传输层规定了应用程序的的接口 协 ...