<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>FluentETL - Data automation made easy for coders</title><link>http://fluentetl.codeplex.com/project/feeds/rss</link><description>Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.</description><item><title>Created Unassigned: Consider scenarios and API for using SqlBulkCopy instead of SqlDataReader for MS SQL Server databases [1965]</title><link>http://fluentetl.codeplex.com/workitem/1965</link><description>Consider scenarios and API for using SqlBulkCopy instead of SqlDataReader for MS SQL Server databases.&lt;br /&gt;-SqlBulkCopy works orders of magnitude faster than SqlDataReader&lt;br /&gt;</description><author>grand</author><pubDate>Mon, 20 May 2013 19:27:55 GMT</pubDate><guid isPermaLink="false">Created Unassigned: Consider scenarios and API for using SqlBulkCopy instead of SqlDataReader for MS SQL Server databases [1965] 20130520072755P</guid></item><item><title>Created Unassigned: Allow LINQ queries to execute on server side by adding ObjectSource.From(IQueryable) overload [1964]</title><link>http://fluentetl.codeplex.com/workitem/1964</link><description>Allow LINQ queries to execute on server side by adding ObjectSource.From&amp;#40;IQueryable&amp;#41; overload.&lt;br /&gt;&lt;br /&gt;Any code that accesses dataSource parameter of ObjectSource.From&amp;#40;IQueryable&amp;#41; should not cast it to IEnumerable or use ToList&amp;#40;&amp;#41;, ToArray&amp;#40;&amp;#41; or AsEnumerable&amp;#40;&amp;#41; on it. This way LINQ will run server side.&lt;br /&gt;&lt;br /&gt;Going one step further it may be better not to enumerate IQueryable dataSource parameter at all, but rather extract SQL from the parameter and pass it into SqlSource.FromQuery&amp;#40;&amp;#41;.&lt;br /&gt;</description><author>grand</author><pubDate>Mon, 20 May 2013 19:10:22 GMT</pubDate><guid isPermaLink="false">Created Unassigned: Allow LINQ queries to execute on server side by adding ObjectSource.From(IQueryable) overload [1964] 20130520071022P</guid></item><item><title>Source code checked in, #19162</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/19162</link><description>Upgrade&amp;#58; New Version of LabDefaultTemplate.xaml. To upgrade your build definitions, please visit the following link&amp;#58; http&amp;#58;&amp;#47;&amp;#47;go.microsoft.com&amp;#47;fwlink&amp;#47;&amp;#63;LinkId&amp;#61;254563</description><author>Project Collection Service Accounts</author><pubDate>Mon, 01 Oct 2012 20:50:51 GMT</pubDate><guid isPermaLink="false">Source code checked in, #19162 20121001085051P</guid></item><item><title>Source code checked in, #19161</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/19161</link><description>Checked in by server upgrade</description><author>Project Collection Service Accounts</author><pubDate>Mon, 01 Oct 2012 20:49:54 GMT</pubDate><guid isPermaLink="false">Source code checked in, #19161 20121001084954P</guid></item><item><title>Reviewed: FluentETL 0.2 (Dec 16, 2011)</title><link>http://fluentetl.codeplex.com/releases/view/51387#ReviewBy-BentoDS</link><description>Rated 5 Stars &amp;#40;out of 5&amp;#41; - Very nice and clean</description><author>BentoDS</author><pubDate>Fri, 16 Dec 2011 10:58:56 GMT</pubDate><guid isPermaLink="false">Reviewed: FluentETL 0.2 (Dec 16, 2011) 20111216105856A</guid></item><item><title>Reviewed: FluentETL 0.2 (Feb 08, 2011)</title><link>http://fluentetl.codeplex.com/releases/view/51387#ReviewBy-Ewok</link><description>Rated 5 Stars &amp;#40;out of 5&amp;#41; - Great work. Excellant when you want to quickly get data from somewhere without having to mess about with SSIS</description><author>Ewok</author><pubDate>Tue, 08 Feb 2011 14:26:22 GMT</pubDate><guid isPermaLink="false">Reviewed: FluentETL 0.2 (Feb 08, 2011) 20110208022622P</guid></item><item><title>Source code checked in, #421</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/421</link><description>v0.2.0.1</description><author>punzie</author><pubDate>Tue, 31 Aug 2010 10:52:49 GMT</pubDate><guid isPermaLink="false">Source code checked in, #421 20100831105249A</guid></item><item><title>Source code checked in, #420</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/420</link><description>fix IDENTITY INSERT</description><author>punzie</author><pubDate>Tue, 31 Aug 2010 10:47:53 GMT</pubDate><guid isPermaLink="false">Source code checked in, #420 20100831104753A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentetl.codeplex.com/wikipage?version=14</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;FluentETL - Data automation made easy for coders&lt;/h2&gt;
Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s how easy it is to copy data from one database to another (identical table schema).&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL.Impl;

...

ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; OleDbSource()
                    .FromQuery(&lt;span style="color:#A31515;"&gt;&amp;quot;select * from Projects&amp;quot;&lt;/span&gt;)
                    .Connection(oleDbConnObj);

IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; SqlDestination()
                    .ToTable(&lt;span style="color:#A31515;"&gt;&amp;quot;Projects&amp;quot;&lt;/span&gt;)
                    .Connection(sqlConnObj)
                    .IdentityInsert()
                    .DeleteFirst();

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .AutoMap()
                    .Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can replace &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; with instances of various ISource and IDestination classes.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; ISource &lt;/th&gt;&lt;th&gt; IDestination &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;td&gt; For SQL Server data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OleDbSource &lt;/td&gt;&lt;td&gt; OleDbDestination &lt;/td&gt;&lt;td&gt; For OLE DB data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TextSource &lt;/td&gt;&lt;td&gt; TextDestination &lt;/td&gt;&lt;td&gt; For text files and text streams &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; ObjectSource &lt;/td&gt;&lt;td&gt; CustomDestination &lt;/td&gt;&lt;td&gt; For custom data sources and processing, with LINQ support &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AutoMap&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transform.AutoMap() maps common field names between source and destination. If destination has no known target fields (like TextDestination), all source fields are mapped.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextSource()
                .From(&lt;span style="color:#A31515;"&gt;@&amp;quot;C:\temp\sample.txt&amp;quot;&lt;/span&gt;)
                .ParseAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)                          &lt;span style="color:Green;"&gt;// Split w/ comma, with first line&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// as header to get field names&lt;/span&gt;
                .ParseAsFixedColumns(&lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;[] { 15, 10, 20 }, &lt;span style="color:Blue;"&gt;false&lt;/span&gt;) &lt;span style="color:Green;"&gt;// Parse with fixed columns, no header&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// Field names are &amp;quot;Field0&amp;quot;, &amp;quot;Field1&amp;quot;, etc.&lt;/span&gt;
                .ParseWith(line =&amp;gt; &lt;span style="color:Blue;"&gt;from&lt;/span&gt; s &lt;span style="color:Blue;"&gt;in&lt;/span&gt; line.Split(&lt;span style="color:#A31515;"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;)
                                   &lt;span style="color:Blue;"&gt;select&lt;/span&gt; s.Trim(), &lt;span style="color:Blue;"&gt;false&lt;/span&gt;)            &lt;span style="color:Green;"&gt;// Split with tabs, then trim; no header&lt;/span&gt;
                ;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Writing text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;View any source data with the following code.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextDestination()
                .To(Console.Out)
                .WithHeader(&lt;span style="color:Blue;"&gt;true&lt;/span&gt;)
                .WriteAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;);

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest).AutoMap().Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Custom data using LINQ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Leverage LINQ for joins, aggregates, custom data sources and code-generated data.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; ObjectSource()
                    .From(
                        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; x &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
                        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#A31515;"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt; + x, Age = 20 + (&lt;span style="color:Blue;"&gt;new&lt;/span&gt; Random(x).Next()) % 20 }
                    );
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;AutoMap() works with &lt;b&gt;ObjectSource&lt;/b&gt; -- it uses the public properties of your objects as the field names.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Transform mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)                                        &lt;span style="color:Green;"&gt;// Map field, same name in destination&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;ManagerName&amp;quot;&lt;/span&gt;)                    &lt;span style="color:Green;"&gt;// Map to different field name&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, x =&amp;gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;.Parse(x.ToString()))  &lt;span style="color:Green;"&gt;// Type conversion&lt;/span&gt;
                    .Map&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, x =&amp;gt; x.Trim()) &lt;span style="color:Green;"&gt;// Map then trimming the value,&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// using strongly-typed generic method&lt;/span&gt;
                    .Unmap(&lt;span style="color:#A31515;"&gt;&amp;quot;Salary&amp;quot;&lt;/span&gt;)                                  &lt;span style="color:Green;"&gt;// Remove mapping -- useful after doing AutoMap()&lt;/span&gt;

                    &lt;span style="color:Green;"&gt;// Decide per row which operation to perform (Insert/Update/Delete),&lt;/span&gt;
                    &lt;span style="color:Green;"&gt;// calls appropriate method in IDestination. Default is RowOperation.ProcessDefault&lt;/span&gt;
                    .DetermineOperation(row =&amp;gt;
                    {
                        &lt;span style="color:Blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:Blue;"&gt;int&lt;/span&gt;)row[&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] &amp;gt;= 100)
                            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Insert;
                        &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Ignore;
                    })

                    .Execute(); &lt;span style="color:Green;"&gt;// Finally, execute&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Transform events&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom insert/update/delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;SqlDestination&lt;/b&gt; and &lt;b&gt;OleDbDestination&lt;/b&gt;, using the FromTable() method presets default logic on how to insert, update and delete to your database. You may need to customize how to perform these operations, e.g. using a stored procedure. Use the InsertWithAction() or InsertWithCommand() methods to customize how to insert, for example.&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More stuff&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How about transactions, logging and all that? Since it&amp;#39;s all in code, you can put FluentETL code within your own transaction code, add logging, parallelize transforms, etc. It&amp;#39;s as powerful as you can code it!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:55:07 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100828115507A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentetl.codeplex.com/wikipage?version=13</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;FluentETL - Data automation made easy for coders&lt;/h2&gt;
Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s how easy it is to copy data from one database to another (identical table schema).&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL.Impl;

...

ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; OleDbSource()
                    .FromQuery(&lt;span style="color:#A31515;"&gt;&amp;quot;select * from Projects&amp;quot;&lt;/span&gt;)
                    .Connection(oleDbConnObj);

IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; SqlDestination()
                    .ToTable(&lt;span style="color:#A31515;"&gt;&amp;quot;Projects&amp;quot;&lt;/span&gt;)
                    .Connection(sqlConnObj)
                    .IdentityInsert()
                    .DeleteFirst();

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .AutoMap()
                    .Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can replace &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; with instances of various ISource and IDestination classes.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; ISource &lt;/th&gt;&lt;th&gt; IDestination &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;td&gt; For SQL Server data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OleDbSource &lt;/td&gt;&lt;td&gt; OleDbDestination &lt;/td&gt;&lt;td&gt; For OLE DB data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TextSource &lt;/td&gt;&lt;td&gt; TextDestination &lt;/td&gt;&lt;td&gt; For text files and text streams &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; ObjectSource &lt;/td&gt;&lt;td&gt; CustomDestination &lt;/td&gt;&lt;td&gt; For custom sources, with LINQ support &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AutoMap&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transform.AutoMap() maps common field names between source and destination. If destination has no known target fields (like TextDestination), all source fields are mapped.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextSource()
                .From(&lt;span style="color:#A31515;"&gt;@&amp;quot;C:\temp\sample.txt&amp;quot;&lt;/span&gt;)
                .ParseAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)                          &lt;span style="color:Green;"&gt;// Split w/ comma, with first line&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// as header to get field names&lt;/span&gt;
                .ParseAsFixedColumns(&lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;[] { 15, 10, 20 }, &lt;span style="color:Blue;"&gt;false&lt;/span&gt;) &lt;span style="color:Green;"&gt;// Parse with fixed columns, no header&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// Field names are &amp;quot;Field0&amp;quot;, &amp;quot;Field1&amp;quot;, etc.&lt;/span&gt;
                .ParseWith(line =&amp;gt; &lt;span style="color:Blue;"&gt;from&lt;/span&gt; s &lt;span style="color:Blue;"&gt;in&lt;/span&gt; line.Split(&lt;span style="color:#A31515;"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;)
                                   &lt;span style="color:Blue;"&gt;select&lt;/span&gt; s.Trim(), &lt;span style="color:Blue;"&gt;false&lt;/span&gt;)            &lt;span style="color:Green;"&gt;// Split with tabs, then trim; no header&lt;/span&gt;
                ;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Writing text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;View any source data with the following code.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextDestination()
                .To(Console.Out)
                .WithHeader(&lt;span style="color:Blue;"&gt;true&lt;/span&gt;)
                .WriteAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;);

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest).AutoMap().Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Custom data using LINQ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Leverage LINQ for joins, aggregates, custom data sources and code-generated data.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; ObjectSource()
                    .From(
                        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; x &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
                        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#A31515;"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt; + x, Age = 20 + (&lt;span style="color:Blue;"&gt;new&lt;/span&gt; Random(x).Next()) % 20 }
                    );
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;AutoMap() works with &lt;b&gt;ObjectSource&lt;/b&gt; -- it uses the public properties of your objects as the field names.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Transform mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)                                        &lt;span style="color:Green;"&gt;// Map field, same name in destination&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;ManagerName&amp;quot;&lt;/span&gt;)                    &lt;span style="color:Green;"&gt;// Map to different field name&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, x =&amp;gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;.Parse(x.ToString()))  &lt;span style="color:Green;"&gt;// Type conversion&lt;/span&gt;
                    .Map&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, x =&amp;gt; x.Trim()) &lt;span style="color:Green;"&gt;// Map then trimming the value,&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// using strongly-typed generic method&lt;/span&gt;
                    .Unmap(&lt;span style="color:#A31515;"&gt;&amp;quot;Salary&amp;quot;&lt;/span&gt;)                                  &lt;span style="color:Green;"&gt;// Remove mapping -- useful after doing AutoMap()&lt;/span&gt;

                    &lt;span style="color:Green;"&gt;// Decide per row which operation to perform (Insert/Update/Delete),&lt;/span&gt;
                    &lt;span style="color:Green;"&gt;// calls appropriate method in IDestination. Default is RowOperation.ProcessDefault&lt;/span&gt;
                    .DetermineOperation(row =&amp;gt;
                    {
                        &lt;span style="color:Blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:Blue;"&gt;int&lt;/span&gt;)row[&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] &amp;gt;= 100)
                            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Insert;
                        &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Ignore;
                    })

                    .Execute(); &lt;span style="color:Green;"&gt;// Finally, execute&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Transform events&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom insert/update/delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;SqlDestination&lt;/b&gt; and &lt;b&gt;OleDbDestination&lt;/b&gt;, using the FromTable() method presets default logic on how to insert, update and delete to your database. You may need to customize how to perform these operations, e.g. using a stored procedure. Use the InsertWithAction() or InsertWithCommand() methods to customize how to insert, for example.&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More stuff&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How about transactions, logging and all that? Since it&amp;#39;s all in code, you can put FluentETL code within your own transaction code, add logging, parallelize transforms, etc. It&amp;#39;s as powerful as you can code it!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:53:52 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100828115352A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentetl.codeplex.com/wikipage?version=12</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;FluentETL - Data automation made easy for coders&lt;/h2&gt;
Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s how easy it is to copy data from one database to another (identical table schema).&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL.Impl;

...

ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; OleDbSource()
                    .FromQuery(&lt;span style="color:#A31515;"&gt;&amp;quot;select * from Projects&amp;quot;&lt;/span&gt;)
                    .Connection(oleDbConnObj);

IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; SqlDestination()
                    .ToTable(&lt;span style="color:#A31515;"&gt;&amp;quot;Projects&amp;quot;&lt;/span&gt;)
                    .Connection(sqlConnObj)
                    .IdentityInsert()
                    .DeleteFirst();

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .AutoMap()
                    .Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can replace &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; with instances of various ISource and IDestination classes.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; ISource &lt;/th&gt;&lt;th&gt; IDestination &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;td&gt; For SQL Server data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OleDbSource &lt;/td&gt;&lt;td&gt; OleDbDestination &lt;/td&gt;&lt;td&gt; For OLE DB data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TextSource &lt;/td&gt;&lt;td&gt; TextDestination &lt;/td&gt;&lt;td&gt; For text files and text streams &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; ObjectSource &lt;/td&gt;&lt;td&gt; CustomDestination &lt;/td&gt;&lt;td&gt; For custom sources, with LINQ support &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AutoMap&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transform.AutoMap() maps common field names between source and destination. If destination has no known target fields (like TextDestination), all source fields are mapped.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextSource()
                .From(&lt;span style="color:#A31515;"&gt;@&amp;quot;C:\temp\sample.txt&amp;quot;&lt;/span&gt;)
                .ParseAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)                          &lt;span style="color:Green;"&gt;// Split w/ comma, with first line&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// as header to get field names&lt;/span&gt;
                .ParseAsFixedColumns(&lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;[] { 15, 10, 20 }, &lt;span style="color:Blue;"&gt;false&lt;/span&gt;) &lt;span style="color:Green;"&gt;// Parse with fixed columns, no header&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// Field names are &amp;quot;Field0&amp;quot;, &amp;quot;Field1&amp;quot;, etc.&lt;/span&gt;
                .ParseWith(line =&amp;gt; &lt;span style="color:Blue;"&gt;from&lt;/span&gt; s &lt;span style="color:Blue;"&gt;in&lt;/span&gt; line.Split(&lt;span style="color:#A31515;"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;)
                                   &lt;span style="color:Blue;"&gt;select&lt;/span&gt; s.Trim(), &lt;span style="color:Blue;"&gt;false&lt;/span&gt;)            &lt;span style="color:Green;"&gt;// Split with tabs, then trim; no header&lt;/span&gt;
                ;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Writing text&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;View any source data with the following code.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextDestination()
                .To(Console.Out)
                .WithHeader(true_
                .WriteAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;);

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest).AutoMap().Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Custom data using LINQ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Leverage LINQ for joins, aggregates, custom data sources and code-generated data.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; ObjectSource()
                    .From(
                        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; x &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
                        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#A31515;"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt; + x, Age = 20 + (&lt;span style="color:Blue;"&gt;new&lt;/span&gt; Random(x).Next()) % 20 }
                    );
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;AutoMap() works with &lt;b&gt;ObjectSource&lt;/b&gt; -- it uses the public properties of your objects as the field names.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Transform mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)                                        &lt;span style="color:Green;"&gt;// Map field, same name in destination&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;ManagerName&amp;quot;&lt;/span&gt;)                    &lt;span style="color:Green;"&gt;// Map to different field name&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, x =&amp;gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;.Parse(x.ToString()))  &lt;span style="color:Green;"&gt;// Type conversion&lt;/span&gt;
                    .Map&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, x =&amp;gt; x.Trim()) &lt;span style="color:Green;"&gt;// Map then trimming the value,&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// using strongly-typed generic method&lt;/span&gt;
                    .Unmap(&lt;span style="color:#A31515;"&gt;&amp;quot;Salary&amp;quot;&lt;/span&gt;)                                  &lt;span style="color:Green;"&gt;// Remove mapping -- useful after doing AutoMap()&lt;/span&gt;

                    &lt;span style="color:Green;"&gt;// Decide per row which operation to perform (Insert/Update/Delete),&lt;/span&gt;
                    &lt;span style="color:Green;"&gt;// calls appropriate method in IDestination. Default is RowOperation.ProcessDefault&lt;/span&gt;
                    .DetermineOperation(row =&amp;gt;
                    {
                        &lt;span style="color:Blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:Blue;"&gt;int&lt;/span&gt;)row[&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] &amp;gt;= 100)
                            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Insert;
                        &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Ignore;
                    })

                    .Execute(); &lt;span style="color:Green;"&gt;// Finally, execute&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Transform events&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom insert/update/delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;SqlDestination&lt;/b&gt; and &lt;b&gt;OleDbDestination&lt;/b&gt;, using the FromTable() method presets default logic on how to insert, update and delete to your database. You may need to customize how to perform these operations, e.g. using a stored procedure. Use the InsertWithAction() or InsertWithCommand() methods to customize how to insert, for example.&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More stuff&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How about transactions, logging and all that? Since it&amp;#39;s all in code, you can put FluentETL code within your own transaction code, add logging, parallelize transforms, etc. It&amp;#39;s as powerful as you can code it!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:51:05 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100828115105A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentetl.codeplex.com/wikipage?version=11</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;FluentETL - Data automation made easy for coders&lt;/h2&gt;
Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s how easy it is to copy data from one database to another (identical table schema).&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL.Impl;

...

ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; OleDbSource()
                    .FromQuery(&lt;span style="color:#A31515;"&gt;&amp;quot;select * from Projects&amp;quot;&lt;/span&gt;)
                    .Connection(oleDbConnObj);

IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; SqlDestination()
                    .ToTable(&lt;span style="color:#A31515;"&gt;&amp;quot;Projects&amp;quot;&lt;/span&gt;)
                    .Connection(sqlConnObj)
                    .IdentityInsert()
                    .DeleteFirst();

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .AutoMap()
                    .Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can replace &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; with instances of various ISource and IDestination classes.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; ISource &lt;/th&gt;&lt;th&gt; IDestination &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;td&gt; For SQL Server data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OleDbSource &lt;/td&gt;&lt;td&gt; OleDbDestination &lt;/td&gt;&lt;td&gt; For OLE DB data &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TextSource &lt;/td&gt;&lt;td&gt; TextDestination &lt;/td&gt;&lt;td&gt; For text files and text streams &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; ObjectSource &lt;/td&gt;&lt;td&gt; CustomDestination &lt;/td&gt;&lt;td&gt; For custom sources, with LINQ support &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;AutoMap&lt;br /&gt;&lt;br /&gt;Transform.AutoMap() maps common field names between source and destination. If destination has no known target fields (like TextDestination), all source fields are mapped.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading text files&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextSource()
                .From(&lt;span style="color:#A31515;"&gt;@&amp;quot;C:\temp\sample.txt&amp;quot;&lt;/span&gt;)
                .ParseAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)                          &lt;span style="color:Green;"&gt;// Split w/ comma, with first line&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// as header to get field names&lt;/span&gt;
                .ParseAsFixedColumns(&lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;[] { 15, 10, 20 }, &lt;span style="color:Blue;"&gt;false&lt;/span&gt;) &lt;span style="color:Green;"&gt;// Parse with fixed columns, no header&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// Field names are &amp;quot;Field0&amp;quot;, &amp;quot;Field1&amp;quot;, etc.&lt;/span&gt;
                .ParseWith(line =&amp;gt; &lt;span style="color:Blue;"&gt;from&lt;/span&gt; s &lt;span style="color:Blue;"&gt;in&lt;/span&gt; line.Split(&lt;span style="color:#A31515;"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;)
                                   &lt;span style="color:Blue;"&gt;select&lt;/span&gt; s.Trim(), &lt;span style="color:Blue;"&gt;false&lt;/span&gt;)            &lt;span style="color:Green;"&gt;// Split with tabs, then trim; no header&lt;/span&gt;
                ;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Testing/viewing data sources&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;View any source data with the following code.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextDestination()
                .To(Console.Out)
                .WithHeader(true_
                .WriteAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;);

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest).AutoMap().Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;LINQ data source&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Leverage LINQ for joins, aggregates, custom data sources and code-generated data.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; ObjectSource()
                    .From(
                        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; x &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
                        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#A31515;"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt; + x, Age = 20 + (&lt;span style="color:Blue;"&gt;new&lt;/span&gt; Random(x).Next()) % 20 }
                    );
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;AutoMap() works with &lt;b&gt;ObjectSource&lt;/b&gt; -- it uses the public properties of your objects as the field names.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Transform mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)                                        &lt;span style="color:Green;"&gt;// Map field, same name in destination&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;ManagerName&amp;quot;&lt;/span&gt;)                    &lt;span style="color:Green;"&gt;// Map to different field name&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, x =&amp;gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;.Parse(x.ToString()))  &lt;span style="color:Green;"&gt;// Type conversion&lt;/span&gt;
                    .Map&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, x =&amp;gt; x.Trim()) &lt;span style="color:Green;"&gt;// Map then trimming the value,&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// using strongly-typed generic method&lt;/span&gt;
                    .Unmap(&lt;span style="color:#A31515;"&gt;&amp;quot;Salary&amp;quot;&lt;/span&gt;)                                  &lt;span style="color:Green;"&gt;// Remove mapping -- useful after doing AutoMap()&lt;/span&gt;

                    &lt;span style="color:Green;"&gt;// Decide per row which operation to perform (Insert/Update/Delete),&lt;/span&gt;
                    &lt;span style="color:Green;"&gt;// calls appropriate method in IDestination. Default is RowOperation.ProcessDefault&lt;/span&gt;
                    .DetermineOperation(row =&amp;gt;
                    {
                        &lt;span style="color:Blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:Blue;"&gt;int&lt;/span&gt;)row[&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] &amp;gt;= 100)
                            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Insert;
                        &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Ignore;
                    })

                    .Execute(); &lt;span style="color:Green;"&gt;// Finally, execute&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Transform events&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom insert/update/delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;SqlDestination&lt;/b&gt; and &lt;b&gt;OleDbDestination&lt;/b&gt;, using the FromTable() method presets default logic on how to insert, update and delete to your database. You may need to customize how to perform these operations, e.g. using a stored procedure. Use the InsertWithAction() or InsertWithCommand() methods to customize how to insert, for example.&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More stuff&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How about transactions, logging and all that? Since it&amp;#39;s all in code, you can put FluentETL code within your own transaction code, add logging, parallelize transforms, etc. It&amp;#39;s as powerful as you can code it!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:50:22 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100828115022A</guid></item><item><title>Created Release: FluentETL 0.2 (Aug 28, 2010)</title><link>http://fluentetl.codeplex.com/releases?ReleaseId=51387</link><description>&lt;div class="wikidoc"&gt;&lt;ul&gt;&lt;li&gt;Complete set of basic ISource and IDestination objects&lt;/li&gt;
&lt;li&gt;Comprehensive Transform events&lt;/li&gt;
&lt;li&gt;Sample application&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:48:05 GMT</pubDate><guid isPermaLink="false">Created Release: FluentETL 0.2 (Aug 28, 2010) 20100828114805A</guid></item><item><title>Released: FluentETL 0.2 (Aug 28, 2010)</title><link>http://fluentetl.codeplex.com/releases/view/51387</link><description>&lt;div class=wikidoc&gt;&lt;ul&gt;&lt;li&gt;Complete set of basic ISource and IDestination objects&lt;/li&gt;
&lt;li&gt;Comprehensive Transform events&lt;/li&gt;
&lt;li&gt;Sample application&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;</description><author></author><pubDate>Sat, 28 Aug 2010 11:48:05 GMT</pubDate><guid isPermaLink="false">Released: FluentETL 0.2 (Aug 28, 2010) 20100828114805A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentetl.codeplex.com/wikipage?version=10</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;FluentETL - Data automation made easy for coders&lt;/h2&gt;
Automate data transfers with a few lines of code. Replace SSIS with concise yet powerful .NET code. Much simpler and easier to learn than Rhino ETL, yet flexible enough to use just about any data source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s how easy it is to copy data from one database to another (identical table schema).&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; FluentETL.Impl;

...

ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; OleDbSource()
                    .FromQuery(&lt;span style="color:#A31515;"&gt;&amp;quot;select * from Projects&amp;quot;&lt;/span&gt;)
                    .Connection(oleDbConnObj);

IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; SqlDestination()
                    .ToTable(&lt;span style="color:#A31515;"&gt;&amp;quot;Projects&amp;quot;&lt;/span&gt;)
                    .Connection(sqlConnObj)
                    .IdentityInsert()
                    .DeleteFirst();

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .AutoMap()
                    .Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can replace &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; with instances of various ISource and IDestination classes.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; ISource &lt;/th&gt;&lt;th&gt; IDestination &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SqlSource &lt;/td&gt;&lt;td&gt; SqlDestination &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TextSource &lt;/td&gt;&lt;td&gt; TextDestination &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; ObjectSource &lt;/td&gt;&lt;td&gt; CustomDestination &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;AutoMap&lt;br /&gt;&lt;br /&gt;Transform.AutoMap() maps common field names between source and destination. If destination has no known target fields (like TextDestination), all source fields are mapped.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading text files&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextSource()
                .From(&lt;span style="color:#A31515;"&gt;@&amp;quot;C:\temp\sample.txt&amp;quot;&lt;/span&gt;)
                .ParseAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)                          &lt;span style="color:Green;"&gt;// Split w/ comma, with first line&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// as header to get field names&lt;/span&gt;
                .ParseAsFixedColumns(&lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;[] { 15, 10, 20 }, &lt;span style="color:Blue;"&gt;false&lt;/span&gt;) &lt;span style="color:Green;"&gt;// Parse with fixed columns, no header&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// Field names are &amp;quot;Field0&amp;quot;, &amp;quot;Field1&amp;quot;, etc.&lt;/span&gt;
                .ParseWith(line =&amp;gt; &lt;span style="color:Blue;"&gt;from&lt;/span&gt; s &lt;span style="color:Blue;"&gt;in&lt;/span&gt; line.Split(&lt;span style="color:#A31515;"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;)
                                   &lt;span style="color:Blue;"&gt;select&lt;/span&gt; s.Trim(), &lt;span style="color:Blue;"&gt;false&lt;/span&gt;)            &lt;span style="color:Green;"&gt;// Split with tabs, then trim; no header&lt;/span&gt;
                ;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Testing/viewing data sources&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;View any source data with the following code.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
IDestination dest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TextDestination()
                .To(Console.Out)
                .WithHeader(true_
                .WriteAsDelimited(&lt;span style="color:#A31515;"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;);

Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest).AutoMap().Execute();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;LINQ data source&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Leverage LINQ for joins, aggregates, custom data sources and code-generated data.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
ISource src = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; ObjectSource()
                    .From(
                        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; x &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
                        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#A31515;"&gt;&amp;quot;Person&amp;quot;&lt;/span&gt; + x, Age = 20 + (&lt;span style="color:Blue;"&gt;new&lt;/span&gt; Random(x).Next()) % 20 }
                    );
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;AutoMap() works with &lt;b&gt;ObjectSource&lt;/b&gt; -- it uses the public properties of your objects as the field names.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Transform mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
Transform t = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Transform(src, dest)
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)                                        &lt;span style="color:Green;"&gt;// Map field, same name in destination&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;ManagerName&amp;quot;&lt;/span&gt;)                    &lt;span style="color:Green;"&gt;// Map to different field name&lt;/span&gt;
                    .Map(&lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;, x =&amp;gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;.Parse(x.ToString()))  &lt;span style="color:Green;"&gt;// Type conversion&lt;/span&gt;
                    .Map&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;Address&amp;quot;&lt;/span&gt;, x =&amp;gt; x.Trim()) &lt;span style="color:Green;"&gt;// Map then trimming the value,&lt;/span&gt;
                                                                      &lt;span style="color:Green;"&gt;// using strongly-typed generic method&lt;/span&gt;
                    .Unmap(&lt;span style="color:#A31515;"&gt;&amp;quot;Salary&amp;quot;&lt;/span&gt;)                                  &lt;span style="color:Green;"&gt;// Remove mapping -- useful after doing AutoMap()&lt;/span&gt;

                    &lt;span style="color:Green;"&gt;// Decide per row which operation to perform (Insert/Update/Delete),&lt;/span&gt;
                    &lt;span style="color:Green;"&gt;// calls appropriate method in IDestination. Default is RowOperation.ProcessDefault&lt;/span&gt;
                    .DetermineOperation(row =&amp;gt;
                    {
                        &lt;span style="color:Blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:Blue;"&gt;int&lt;/span&gt;)row[&lt;span style="color:#A31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] &amp;gt;= 100)
                            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Insert;
                        &lt;span style="color:Blue;"&gt;return&lt;/span&gt; RowOperation.Ignore;
                    })

                    .Execute(); &lt;span style="color:Green;"&gt;// Finally, execute&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Transform events&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Custom insert/update/delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;SqlDestination&lt;/b&gt; and &lt;b&gt;OleDbDestination&lt;/b&gt;, using the FromTable() method presets default logic on how to insert, update and delete to your database. You may need to customize how to perform these operations, e.g. using a stored procedure. Use the InsertWithAction() or InsertWithCommand() methods to customize how to insert, for example.&lt;br /&gt;&lt;br /&gt;TODO&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More stuff&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How about transactions, logging and all that? Since it&amp;#39;s all in code, you can put FluentETL code within your own transaction code, add logging, parallelize transforms, etc. It&amp;#39;s as powerful as you can code it!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:44:05 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100828114405A</guid></item><item><title>Source code checked in, #348</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/348</link><description>exclude Data from build</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:31:05 GMT</pubDate><guid isPermaLink="false">Source code checked in, #348 20100828113105A</guid></item><item><title>Source code checked in, #347</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/347</link><description>v0.2, fix OLE DB default update, add PreTransform and PostTransform to DB destinations, data refresh</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 11:25:23 GMT</pubDate><guid isPermaLink="false">Source code checked in, #347 20100828112523A</guid></item><item><title>Source code checked in, #345</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/345</link><description>add validation event, examples project &amp;#43; data, OLE DB default insert&amp;#47;update commands</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 09:53:32 GMT</pubDate><guid isPermaLink="false">Source code checked in, #345 20100828095332A</guid></item><item><title>Source code checked in, #343</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/343</link><description>fix interface errors &amp;#40;not checked in code&amp;#41;, add row validation step</description><author>punzie</author><pubDate>Sat, 28 Aug 2010 04:03:27 GMT</pubDate><guid isPermaLink="false">Source code checked in, #343 20100828040327A</guid></item><item><title>Source code checked in, #333</title><link>http://fluentetl.codeplex.com/SourceControl/changeset/changes/333</link><description>rationalize Transform events, add ISource.InTransformContext</description><author>punzie</author><pubDate>Fri, 27 Aug 2010 16:31:39 GMT</pubDate><guid isPermaLink="false">Source code checked in, #333 20100827043139P</guid></item></channel></rss>