上前的写法过于难看,于是想利用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){
总结:
不要指望很简单的做完一件事情,尤其不要去做电脑做的事。