社区
VB
帖子详情
请问一下, public static List
ToList
(this DataTable dt) where T : class, new()
eaqpi
2017-12-02 08:24:44
public static List<T> ToList<T>(this DataTable dt) where T : class, new()
这句话翻译成vb.net 应该如何写?
...全文
591
2
打赏
收藏
请问一下, public static List<T> ToList<T>(this DataTable dt) where T : class, new()
public static List ToList(this DataTable dt) where T : class, new() 这句话翻译成vb.net 应该如何写?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
以专业开发人员为伍
2017-12-03
打赏
举报
回复
给你搜了一个文章
http://developer.51cto.com/art/201001/179788.htm
你看看 vb.net 如何约束泛型类。
以专业开发人员为伍
2017-12-03
打赏
举报
回复
这个静态方法把 DataTable 转换为List<T>,要求 T 是一个引用类型、可实例化(非抽象)类型。你可以学习一下 vb.net 看看相关设计功能的编程基础语法。
简单的ADO.net数据访问客户端
原文地址:https://github.com/andolove/Data 感谢作者!很实用 简单的Ado.net数据访问客户端。 数据库访问入口 获取IDbClient 在开始之前,先添加一个数据库访问入口。当然,也可以使用任何你喜欢的方式来创建IDbClient(的实现类)实例。
public
static
class
Db { private
static
readonly Dictionary
KnownClients =
new
Dictionary
();
public
static
IDbClient Northwind { get { return GetClient("Northwind", "server=.;database=Northwind;trusted_connection=true;"); } } private
static
IDbClient GetClient(string name, string connectionString) { IDbClient client; if (KnownClients.TryGetValue(name, out client)) return client; lock (KnownClients) { if (KnownClients.TryGetValue(name, out client)) return client; // 创建IDbClient的实例 client =
new
SqlDbClient(connectionString); KnownClients.Add(name, client); } return client; } } 现在,可以使用Db.Northwind来访问SQLServer的Northwind示例数据库了。 访问其他数据库 如果要访问MySql,可以用几行代码实现一个面向MySql的IDbClient实现。下面以使用 MySql.Data.dll 作为MySql .net客户端提供器为例。 ///
/// Mysql数据库访问客户端。 ///
public
class
MysqlDbClient : AbstractDbClient { private readonly string _connectionString; ///
/// 使用指定的数据库类型和连接字符串初始化
的新实例。 ///
///
连接字符串。
public
MysqlDbClient(string connectionString) { ArgAssert.NotNullOrEmptyOrWhitespace(connectionString, "connectionString"); _connectionString = connectionString; } ///
/// 获取当前实例所使用的数据库连接字符串。 ///
public
override string ConnectionString { get { return _connectionString; } } ///
/// 获取当前实例所使用的
实例。 ///
protected override DbProviderFactory Factory { get { return MySql.Data.MySqlClient.MySqlClientFactory.Instance; } } } 现在可以创建MySql的访问客户端了: IDbClient client =
new
MysqlDbClient("server=.;database=MySqlDb;uid=user;pwd=password"); 类似的,可以创建访问Oracle,Sqlite或是其他数据库的客户端,只需要找到对应的DbProviderFactory实例即可。 基本数据库操作 基础CRUD // 查询 string productName = (string)Db.Northwind.Scalar( "SELECT ProductName FROM Products WHERE ProductID=115");
DataTable
productTable = Db.Northwind.
DataTable
("SELECT * FROM Products"); // 更新 int affectedRows = Db.Northwind.Execute( "UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); // 在没有命中一行的时候抛出异常 int expectedSize = 1; Db.Northwind.SizedExecute( expectedSize, "UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); // 获取一行 IDataRecord record = Db.Northwind.GetRow( "SELECT ProductName, SupplierID FROM Products WHERE ProductID=115"); int supplierId = Convert.ToInt32(record["SupplierID"]); // 在不用在意资源释放的情况下使用DataReader,利用了foreach的机制,在循环结束后DataReader会自动关闭 IEnumerable
rows = Db.Northwind.Rows( "SELECT ProductName, SupplierID FROM Products WHERE ProductID=115"); foreach (IDataRecord row in rows) { Console.WriteLine(row["ProductName"]); } 使用参数和调用存储过程 // 使用参数 DbParameter parameter = Db.Northwind.CreateParameter(); parameter.DbType = DbType.String; parameter.ParameterName = "CustomerID"; parameter.Value = "ALFKI"; parameter.Direction = ParameterDirection.Input; // 调用存储过程 CustOrderHist @CustomerID DataSet ds = Db.Northwind.DataSet( "CustOrderHist",
new
[] { parameter }, Comman
dT
ype.StoredProcedure); // 使用DbClientParamEx中的扩展方法快速创建参数(需要using Data命名空间) DbParameter[] parameters =
new
[] { Db.Northwind.CreateParameter("id", DbType.Int32, 115, direction: ParameterDirection.Input), Db.Northwind.CreateParameter("name", DbType.String, "Ikura", 5) }; Db.Northwind.DataSet("SELECT * FROM Products WHERE ProductName=@name OR ProductID=@id", parameters); 使用Mapper IMapper
接口定义了从IDataRecord到T类型的映射,可以用过实现该接口,以便从数据库读取并创建特定类型实例及实例的集合。
public
class
Product {
public
int ProductID;
public
string ProductName; }
public
class
ProductMapper : IMapper
{
public
Product MapRow(IDataRecord record, int rowNum) { var product =
new
Product(); product.ProductID = Convert.ToInt32(record["ProductID"]); product.ProductName = record["ProductName"].ToString(); return product; } } 利用上面的ProductMapper,我们可以直接从查询中创建Product实例了。 // 获取一个实例 Product product = Db.Northwind.Get(
new
ProductMapper(), "SELECT * FROM Products WHERE ProductID=115"); // 获取实例的集合 I
List
products = Db.Northwind.
List
(
new
ProductMapper(), "SELECT * FROM Products"); Mappers类中已经定义了部分简单类型的Mapper实现,以便实现便捷的查询。 // 使用已定义好的简单Mapper I
List
productNames = Db.Northwind.
List
( Mappers.String(), "SELECT ProductName FROM Products"); I
List
productIds = Db.Northwind.
List
( Mappers.Int32(), "SELECT ProductID FROM Products"); // 使用实现IConvertible的类型创建Mapper I
List
orderDates = Db.Northwind.
List
( Mappers.Convertible
(), "SELECT OrderDate FROM Orders"); 使用事务 使用CreateTransaction方法来获取一个ITransactionKeeper事务容器。获取到的事务容器自身也实现了IDbClient,可以在其上进行各种CRUD操作。 事务的最后,别忘了Commit。 ITransactionKeeper同时也实现了IDisposable接口,其Dispose方法能够在事务没有提交时进行事务回滚(如果已经提交,则什么也不做),利用这个机制和C#的using语法,可以很方便的编写一个在出现异常时回滚的事务操作。 using (ITransactionKeeper tran = Db.Northwind.CreateTransaction()) { tran.Execute("UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); tran.Execute("UPDATE Products SET ProductName='The Name2' WHERE ProductID=118"); tran.Commit(); } Dynamic扩展 在Data.Dynamic命名空间的ObjectiveExtension类中,定义了一套IDbClient的扩展方法,能够使用更快捷的方式进行数据库操作。 .net对象传参 这些扩展方法具有与IDbClient中的方法很类似的签名,但能够接收一个用于存放参数信息的.net对象,以节省许多编码量(是的,和Dapper、ServiceStack.OrmLite很相似)。 通过这些扩展方法,上面使用参数的示例可以这样写了: DataSet ds = Db.Northwind.DataSet( "CustOrderHist",
new
{ CustomerID = "ALFKI" }, Comman
dT
ype.StoredProcedure);
DataTable
dt
= Db.Northwind.
DataTable
( "SELECT * FROM Products WHERE ProductName=@name OR ProductID=@id",
new
{ name = "Ikura", id = 115 }); 获取类型实例 现在不指定Mapper就可以直接进行对象查询了。 Product product = Db.Northwind.Get
("SELECT * FROM Products WHERE ProductID=115"); I
List
products = Db.Northwind.
List
("SELECT * FROM Products"); I
List
orderDates = Db.Northwind.
List
("SELECT OrderDate FROM Orders"); 在这些方法内部,会在运行时动态生成对应的Mapper,并且生成一次以后,信息会被缓存下来,不需要每次都重新创建。当然,因为做了更多的是事情,它还是会比非扩展的原生版本慢那么一点点。 也可以使用匿名对象作为实体模板,在许多场景尤其是处理包含少量字段(但又多于1个)时尤其方便。 var template =
new
{ ProductID = 0, ProductName = string.Empty }; var productsByTemplate = Db.Northwind.Template
List
(template, "SELECT * FROM Products"); 关于字段名称的匹配 .net对象的属性和公共字段使用Pascal命名法,但数据库规范中的字段命名法可能不一样,比如MySql的snake_case命名法;而且也有太多的数据库设计使用“意识流”了。为了解决这个命名差异问题,查询结果映射到非匿名对象字段时支持字段名称的模糊匹配,具体规则如下,越靠前的规则优先级越高: 查询结果的字段名称和对象字段名称完全一致; 大小写不敏感的匹配;例:查询结果字段goodName可映射到对象字段GoodName。 查询结果的字段名称移除下划线(头尾的下划线将保留)之后,再进行大小写不敏感的匹配;例:查询结果字段good_name可映射到对象字段GoodName;_goodName不会映射到GoodName,因为头尾的下划线不会被忽略。 字体匹配时,考前的规则将优先进行匹配,没有匹配到的字段再使用下一优先级的规则进行匹配。若所有规则都为命中,则对象字段将在映射中被忽略从而保持字段类型的默认值。 注意:使用匿名对象作为模板查询时,匿名对象的字段名称需和查询结果的字段名称完全匹配,不支持模糊匹配。 Indexing扩展 在Data.Indexing命名空间的IndexingExtension类中,定义了另外一套IDbClient的扩展方法,能够基于索引访问传入的参数。 记得string.Format方法吗: string.Format("My name is {0}, I'm {1} years old.", "John Doe", 8); 类似的,这些扩展方法用起来是这个样子的:
DataTable
dt
= Db.Northwind.
DataTable
( "SELECT * FROM Products WHERE ProductName=@0 OR ProductID=@1", "Ikura", 115); I
List
products = Db.Northwind.
List
( "SELECT * FROM Products WHERE ProductID IN (@0, @1)", 15, 16); 通常在一个地方并不混用两套扩展。Dynamic扩展会更泛用一些,但在一些特定的场景下,使用Indexing扩展也是个好主意。还有,这套扩展方法速度会更快一些。
支持库:
DataTable
扩展To
List
方法
public
static
class
DataTable
Extensions {
public
static
List
<T> To
List
<T>(this
DataTable
dt
) where T :
new
() { var
list
=
new
List
<T>(); ...
将
DataTable
转换为
List
<T>以及<T>类
ConvertHelper类请参考 https://www.cnblogs.com/axiaoshuye/articles/15697734.html。最开始是使用循环一个个给类的属性赋值,但是这样效率低并且无法复用。将
DataTable
转化为
List
,使用
DataTable
.To
List
();将
DataTable
转化为,使用
DataTable
.ToData();转换的前提条件是
DataTable
字段名要与对应类的属性名一致。填充已有内容,使用
DataTable
.FillData();...
利用反射实现
DataTable
与
List
转换
今天上班不太忙,就想着总结
一下
反射、扩展方法、以及lambda表达式的用法,自己就写了个小DEMO记录
一下
,希望各位大牛们看到后觉得不对的地方请及时提出。这篇文章中我只说明我的用法,作为一个备忘,基本的语法我不讲解,对这些概念不熟悉的童鞋在博客园上搜素
一下
,呢那个找到很多相关的讲解,小弟就先抛砖引玉了。 另附链接一枚,如果你想知道c#1.0--c#4.0 主要基础知识汇总,请猛点下面链...
List
转换为
DataTable
关于
List
转换为
DataTable
的问题一直是开发过程中经常用到的,现从网上整理几个常用的转换方式,留作备用。 (尊重作者原创,本文代码转发自
List
与
DataTable
转换 )
public
static
class
DataTable
Extensions { /// /// 转化一个
DataTable
///
VB
16,554
社区成员
110,527
社区内容
发帖
与我相关
我的任务
VB
VB技术相关讨论,主要为经典vb,即VB6.0
复制链接
扫一扫
分享
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章