微软的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语言指针专题——为何要学习指针

    欢迎转发本文! 之前的文章与各位谈论了指针是什么,以及指针为何这那么难学.不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊.指针其实就是一个纸老虎,你看着可怕,等你了解其本 ...

  2. 小程序实现图片上传,预览以及图片base64位处理

    最近一段时间在做小程序项目,第一期功也完工了.需要好好总结一下经验,把项目中遇到的问题好好总结一下,遇到的问题,踩过的坑.今天写一个小程序实现图片上传,预览,以及删除,图片base64位处理.下面就是 ...

  3. 使用ML-Agents Toolkit(0.5)训练游戏ai之游戏打包

    这篇文章介绍如何训练官方的一个例子3dball. 确保在此之前已经安装好训练环境可以参考下面的文章. https://www.cnblogs.com/pojdd/p/9804322.html 游戏打包 ...

  4. Flutter学习笔记(9)--组件Widget

    如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...

  5. [leetcode] 464. Can I Win (Medium)

    原题链接 两个人依次从1~maxNum中选取数字(不可重复选取同一个),累和.当一方选取数字累和后结果大于等于给定的目标数字,则此人胜利. 题目给一个maxNum和targetNum,要求判断先手能否 ...

  6. 一文了解JVM

    一.什么是JVM JVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实 ...

  7. 基于tess4j的图片文字提取

    1.文件结构目录 2.具体实现 ①添加maven依赖 <dependency> <groupId>net.sourceforge.tess4j</groupId> ...

  8. 0728 history

    -- :: cd /etc/yum.repos.d/ -- :: wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox. ...

  9. C#中谁最快:结构还是类?

    前言 在内存当道的日子里,无论什么时候都要考虑这些代码是否会影响程序性能呢? 在现在的世界里,几乎不会去考虑用了几百毫秒,可是在特别的场景了,往往这几百毫米确影响了整个项目的快慢. 通过了解这两者之间 ...

  10. 初次见面C#排坑记录

    排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会. 一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,