DATASET2ANYCODE之二 FOREACH

上前的写法过于难看,于是想利用LAMBDA写法来精简写法,思路没问题,写法没问题,实现 时有问题了,本想偷点懒,直接用3.5的LAMBDA来实现,不过首先遭遇了无法解析=>的问题

找了些资料,无意中发现了一个,也的确应该这样写,CSharpCodePrivoder本身是2.0的,但如何支持3.5的LAMBDA呢,


以下代码解决

CSharpCodeProvider CSharpCodePrivoder =new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });// new CSharpCodeProvider();


为了折腾这个写法,花费了好几个小时,VS编译能通过,动态执行就是不能通过。痛苦啊。只是想优化一下,让人脑更简单一点,总之让人脑去做电脑做的事情,最后会变成猪脑。


继续往下,又出现了不可回避的问题


new System.Data.DataSet().Tables.AsQueryable

以上代码编译没有问题,但是执行时会报错,因为未实现 IQUERYABLE接口,于是FOREACH泡汤了。除非自己去实现这个接口。与其实现,不如不用LAMBDA,

最后想像中的写法没有实现 


new System.Data.DataSet().Tables.ForEach(table=>{

最后觉得最简单的是只稳定的,偷懒只是模板简化一些,后台实现 不能就不能吧,改成普通的写法就是,于是把LAMBDA的表达形式改为如下了


//qoushui project template
code{.
IDataSet2Sql DS2Sql =new DataSet2MSSql();
int colIndex=0;
.}
@ds.Tables.ForEach((DataTable)table){
code{.
	colIndex=0;
.}
	create table @table.TableName 
	( 
	   @table.Columns.ForEach((DataColumn)column){
	       @column.ColumnName  @DS2Sql.GetDataTypeString(column) @colIndex++==table.Columns.Count-1?"":","        
	   }
	) ;
	
}


不得已啊,虽然也可以去检查每个FOREACH的类型,倒不如直接在模板中指定来得快,

 @table.Columns.ForEach((DataColumn)column){

在后台解析时实际上被转换为了


foreach(DataColumn column in table.Columns){



总结:

不要指望很简单的做完一件事情,尤其不要去做电脑做的事。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值