level up your biml: best practices and coding techniques (tuga it 2016)
TRANSCRIPT
![Page 1: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/1.jpg)
TUGA IT 2016LISBON, PORTUGAL
![Page 2: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/2.jpg)
THANK YOU TO OUR SPONSORS
![Page 3: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/3.jpg)
THANK YOU TO OUR TEAM
ANDRÉ BATISTA ANDRÉ MELANCIA ANDRÉ VALA ANTÓNIO LOURENÇO BRUNO LOPES CLÁUDIO SILVA
NIKO NEUGEBAUER
RUI REISRICARDO CABRAL
NUNO CANCELO PAULO MATOS PEDRO SIMÕES
SANDRA MORGADO SANDRO PEREIRARUI BASTOS
NUNO ÁRIAS SILVA
![Page 4: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/4.jpg)
Level Up Your Biml:Best Practices and Coding Techniques
Cathrine Wilhelmsen · TUGA IT · May 21st 2016
![Page 5: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/5.jpg)
Session Description
Is your Biml solution starting to remind you of a bowl of tangled spaghetti code? Good! That means you are solving real problems while saving a lot of time. The next step is to make sure that your solution does not grow too complex and confusing – you do not want to waste all that saved time on future maintenance!
Attend this session for an overview of Biml best practices and coding techniques. Step by step, we will simplify and enhance our solution. Learn how to centralize and reuse code with Include files and the CallBimlScript method. Make your code easier to read and write by utilizing LINQ (Language-Integrated Queries). Share code between files by using Annotations and ObjectTags. And finally, if standard Biml is not enough to solve your problems, you can create your own C# helper classes and extension methods to implement custom logic.
Start improving your code today and level up your Biml in no time!
![Page 6: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/6.jpg)
You…
…?
Know basic Biml and BimlScript
Completed BimlScript.com lessons
Have created a staging environment
![Page 7: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/7.jpg)
Next 70 minutes…
…?
Code Management
Practical Biml Coding
C# Classes and Methods
![Page 8: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/8.jpg)
Cathrine Wilhelmsen
@cathrinew
cathrinewilhelmsen.net
Data Warehouse ArchitectBusiness Intelligence Developer
![Page 9: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/9.jpg)
Biml Tools
![Page 10: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/10.jpg)
What do you need?
![Page 11: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/11.jpg)
BIDS Helper
Free open-source add-in for Visual Studio
60+ features for SSIS, SSAS and SSRS
Includes basic Biml package generator
bidshelper.codeplex.com
![Page 12: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/12.jpg)
…or you can use the new Biml tools
![Page 13: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/13.jpg)
BimlExpress
Free add-in for Visual Studio
Code editor with syntax highlighting and Biml Intellisense
More frequent updates than BIDS Helper
varigence.com/bimlexpress
![Page 14: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/14.jpg)
BimlOnline
Free browser-based Biml editor
Code editor with Biml and C# Intellisense
Reverse-engineer from SSIS to Biml
bimlonline.com
![Page 15: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/15.jpg)
BimlStudio
Licensed full-featured development environment for Biml
Visual designer and metadata modeling
Full-stack automation and transformers
varigence.com/bimlstudio
![Page 16: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/16.jpg)
Comparing Biml Tools
Free
Biml Intellisense
"Black Box"
Free
Full Intellisense
Logical View
Licensed
Full IDE
Preview BimlScript
![Page 17: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/17.jpg)
Biml and BimlScript
![Page 18: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/18.jpg)
Biml
Business Intelligence Markup Language
XML Language – just text
Easy to read and write – but can be verbose
You can use any tool to generate the Biml for you…
(Text editor macros, Excel, PowerShell, T-SQL ++)
![Page 19: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/19.jpg)
BimlScript
…but use BimlScript :)
Extend Biml with integrated C# (or VB) code blocks
Allows you to generate, control and manipulate Biml
Import metadata and quickly script entire solutions
![Page 20: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/20.jpg)
BimlScript Code Nuggets
<# … #> Control Nuggets (Control logic)
<#= … #> Text Nuggets (Returns string)
<#@ … #> Directives (Compiler instructions)
<#+ … #> Class Nuggets (Create C# classes)
![Page 21: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/21.jpg)
How does it work?
![Page 22: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/22.jpg)
Yes, but how does it work?
![Page 23: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/23.jpg)
Yes, but how does it actually work?
<Biml xmlns="http://schemas.varigence.com/biml.xsd"><Packages>
<# foreach (var table in RootNode.Tables) { #><Package Name="Load_<#=table.Name#>"></Package>
<# } #></Packages>
</Biml><Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Packages><Package Name="Load_Customer"/><Package Name="Load_Product"/><Package Name="Load_Sales"/>
</Packages></Biml>
![Page 24: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/24.jpg)
Biml and BimlScript
Flat XML"Just text"
Generate, control and manipulate Biml with C#
![Page 25: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/25.jpg)
Code Management
![Page 26: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/26.jpg)
Don't Repeat Yourself
Move common code to separate files
Centralize and reuse in many projects
Update code once for all projects
1. Include files
2. CallBimlScript with Parameters
3. Tiered Biml files
![Page 27: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/27.jpg)
Include Files
Include common code in multiple files and projects
Can include many file types: .biml .txt .sql .cs
Use the include directive
<#@ include file="CommonCode.biml" #>
The directive will be replaced by the included file
Works like an automated Copy & Paste
![Page 28: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/28.jpg)
Include Files
![Page 29: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/29.jpg)
Include Files
![Page 30: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/30.jpg)
Include Files
![Page 31: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/31.jpg)
CallBimlScript with Parameters
Works like a parameterized include (or stored procedure)
File to be called (callee) specifies input parameters it accepts
<#@ property name="Parameter" type="String" #>
File that calls (caller) passes input parameters
<#=CallBimlScript("CommonCode.biml", Parameter)#>
![Page 32: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/32.jpg)
CallBimlScript with Parameters
![Page 33: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/33.jpg)
CallBimlScript with Parameters
![Page 34: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/34.jpg)
CallBimlScript with Parameters
![Page 35: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/35.jpg)
CallBimlScript with Parameters
![Page 36: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/36.jpg)
CallBimlScript with Parameters
![Page 37: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/37.jpg)
Tiered Biml Files
Split Biml code in multiple files and use the template directive:
<#@ template tier="1" #>
Compile Biml from lowest to highest tier to:
• Solve logical dependencies
• Simulate manual workflows
For each tier, objects are added to the RootNode
Higher tiers can use objects from lower tiers
![Page 38: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/38.jpg)
What is this RootNode?
When working with flat Biml,the <Biml> root element contains collections of root objects:
<Biml>
<Connections>...</Connections>
<Databases>...</Databases>
<Schemas>...</Schemas>
<Tables>...</Tables>
<Projects>...</Projects>
<Packages>...</Packages>
</Biml>
When working with BimlScript, the RootNode contains collections of root objects:
=
![Page 39: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/39.jpg)
How do I query the RootNode?
Query the RootNode to loop over collections:<# foreach (var table in RootNode.Tables) { #>
Query the RootNode to get specific objects:<#=RootNode.Tables["Product"].Schema#>
![Page 40: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/40.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 41: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/41.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 42: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/42.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 43: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/43.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 44: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/44.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 45: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/45.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 46: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/46.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 47: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/47.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 48: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/48.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 49: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/49.jpg)
Inside the Black Box: Tiered Biml Files
<#@ template tier="1" #><Connections>...</Connections>
<#@ template tier="2" #><Packages>...</Packages>
<#@ template tier="3" #><Package>...</Package>
![Page 50: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/50.jpg)
Inside the Black Box: Tiered Biml Files
![Page 51: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/51.jpg)
How do you use Tiered Biml files?
1. Create Biml files with specified tiers
2. Select all the tiered Biml files
3. Right-click and click Generate SSIS Packages
1
2
3
![Page 52: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/52.jpg)
How does thisactually work?
![Page 53: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/53.jpg)
Debugging
![Page 54: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/54.jpg)
Debugging Biml
BimlExpress is a "black box":• You can only see the generated SSIS packages
• It is not possible to see the compiled Biml first
Add a high-tier helper file to save compiled Biml to file• Check Biml For Errors saves compiled Biml
without generating packages
![Page 55: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/55.jpg)
SaveFlatBimlToFile.biml
Add the helper file to your project…
<#@ template tier="999" #><# System.IO.File.WriteAllText(
@"C:\Biml\FlatBiml.xml", RootNode.GetBiml()
); #>
![Page 56: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/56.jpg)
SaveFlatBimlToFile.biml
…with a high tier so it is executed as the last step
<#@ template tier="999" #><# System.IO.File.WriteAllText(
@"C:\Biml\FlatBiml.xml", RootNode.GetBiml()
); #>
![Page 57: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/57.jpg)
SaveFlatBimlToFile.biml
It creates a file…
<#@ template tier="999" #><# System.IO.File.WriteAllText(
@"C:\Biml\FlatBiml.xml", RootNode.GetBiml()
); #>
![Page 58: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/58.jpg)
SaveFlatBimlToFile.biml
…at the specified path…
<#@ template tier="999" #><# System.IO.File.WriteAllText(
@"C:\Biml\FlatBiml.xml", RootNode.GetBiml()
); #>
![Page 59: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/59.jpg)
SaveFlatBimlToFile.biml
…with all the Biml for all the objects in RootNode :)
<#@ template tier="999" #><# System.IO.File.WriteAllText(
@"C:\Biml\FlatBiml.xml", RootNode.GetBiml()
); #>
![Page 60: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/60.jpg)
How do you use this helper file?
1. Create the helper file
2. Select all the Biml files and the helper file
3. Right-click and click Check Biml For Errors
1
2
3
![Page 61: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/61.jpg)
How is thishelper file used?
![Page 62: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/62.jpg)
Annotations and ObjectTags
![Page 63: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/63.jpg)
Annotations and ObjectTags
Biml Annotations != SSIS Annotations
Annotations are string/string Key/Value pairs
ObjectTags are string/object Key/Value pairs
Use Annotations and ObjectTags to pass code between Biml files
![Page 64: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/64.jpg)
Annotations
Create annotations:<OleDbConnection Name="Destination" ConnectionString="…">
<Annotations>
<Annotation Tag="Schema">AW2014</Annotation>
</Annotations>
</OleDbConnection>
Use annotations:<# var destinationSchema =
RootNode.OleDbConnections["Destination"].GetTag("Schema"); #>
![Page 65: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/65.jpg)
ObjectTags
Create ObjectTags:<#
RootNode.OleDbConnections["Destination"].ObjectTag["TableFilter"] =
new List<string> {"Product","ProductSubcategory","ProductCategory"};
#>
Use ObjectTags:<#
var TableFilter = (List<string>)
RootNode.OleDbConnections["Destination"].ObjectTag["TableFilter"];
#>
![Page 66: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/66.jpg)
LINQ
![Page 67: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/67.jpg)
LINQ (Language-Integrated Query)
One language to query:
SQL Server Databases
XML Documents
Datasets
Collections
Two ways to write queries:
SQL-like Syntax
Extension Methods
![Page 68: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/68.jpg)
LINQ Extension Methods
..and many, many more!
Sort
OrderBy, ThenBy
Filter
Where, OfType
Group
GroupBy
Aggregate
Count, Sum
Check Collections
All, Any, Contains
Get Elements
First, Last, ElementAt
Project Collections
Select, SelectMany
![Page 69: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/69.jpg)
LINQ Extension Methods
var numConnections = RootNode.Connections.Count()
foreach (var table in RootNode.Tables.Where(…))
if (RootNode.Packages.Any(…))
![Page 70: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/70.jpg)
LINQ and Lambda expressions
Use lambda expressions to filter or specify values:
.Where(table => table.Schema.Name == "Production")
.OrderBy(table => table.Name)
![Page 71: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/71.jpg)
LINQ and Lambda expressions
For each element in the collection…
.Where(table => table.Schema.Name == "Production")
.OrderBy(table => table.Name)
![Page 72: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/72.jpg)
LINQ and Lambda expressions
…evaluate a criteria or get a value:
.Where(table => table.Schema.Name == "Production")
.OrderBy(table => table.Name)
![Page 73: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/73.jpg)
LINQ: Filter collections
Where()
Returns the filtered collection with all elements that meet the criteria
RootNode.Tables.Where(t => t.Schema.Name == "Production")
OfType()
Returns the filtered collection with all elements of the specified type
RootNode.Connections.OfType<AstExcelOleDbConnectionNode>()
![Page 74: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/74.jpg)
LINQ: Sort collections
OrderBy()
Returns the collection sorted by key…
RootNode.Tables.OrderBy(t => t.Name)
ThenBy()
…then sorted by secondary key
RootNode.Tables.OrderBy(t => t.Schema.Name).ThenBy(t => t.Name)
![Page 75: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/75.jpg)
LINQ: Sort collections
OrderByDescending()
Returns the collection sorted by key…
RootNode.Tables.OrderByDescending(t => t.Name)
ThenByDescending()
…then sorted by secondary key
RootNode.Tables.OrderBy(t => t.Schema.Name).ThenByDescending(t => t.Name)
![Page 76: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/76.jpg)
LINQ: Sort collections
Reverse()
Returns the collection sorted in reverse order
RootNode.Tables.Reverse()
![Page 77: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/77.jpg)
LINQ: Group collections
GroupBy()
Returns a collection of key-value pairs where each value is a new collection
RootNode.Tables.GroupBy(t => t.Schema.Name)
![Page 78: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/78.jpg)
LINQ: Aggregate collections
Count()
Returns the number of elements in the collection
RootNode.Tables.Count()
RootNode.Tables.Count(t => t.Schema.Name == "Production")
![Page 79: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/79.jpg)
LINQ: Aggregate collections
Sum()
Returns the sum of the (numeric) values in the collection
RootNode.Tables.Sum(t => t.Columns.Count)
Average()
Returns the average value of the (numeric) values in the collection
RootNode.Tables.Average(t => t.Columns.Count)
![Page 80: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/80.jpg)
LINQ: Aggregate collections
Min()
Returns the minimum value of the (numeric) values in the collection
RootNode.Tables.Min(t => t.Columns.Count)
Max()
Returns the maximum value of the (numeric) values in the collection
RootNode.Tables.Max(t => t.Columns.Count)
![Page 81: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/81.jpg)
LINQ: Check collections
All()
Returns true if all elements in the collection meet the criteria
RootNode.Databases.All(d => d.Name.StartsWith("A"))
Any()
Returns true if any element in the collection meets the criteria
RootNode.Databases.Any(d => d.Name.Contains("DW"))
![Page 82: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/82.jpg)
LINQ: Check collections
Contains()
Returns true if collection contains element
RootNode.Databases.Contains(AdventureWorks2014)
![Page 83: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/83.jpg)
LINQ: Get elements
First()
Returns the first element in the collection (that meets the criteria)
RootNode.Tables.First()
RootNode.Tables.First(t => t.Schema.Name == "Production")
FirstOrDefault()
Returns the first element in the collection or default value (that meets the criteria)
RootNode.Tables.FirstOrDefault()
RootNode.Tables.FirstOrDefault(t => t.Schema.Name == "Production")
![Page 84: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/84.jpg)
LINQ: Get elements
Last()
Returns the last element in the collection (that meets the criteria)
RootNode.Tables.Last()
RootNode.Tables.Last(t => t.Schema.Name == "Production")
LastOrDefault()
Returns the last element in the collection or default value (that meets the criteria)
RootNode.Tables.LastOrDefault()
RootNode.Tables.LastOrDefault(t => t.Schema.Name == "Production")
![Page 85: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/85.jpg)
LINQ: Get elements
ElementAt()
Returns the element in the collection at the specified index
RootNode.Tables.ElementAt(42)
ElementAtOrDefault()
Returns the element in the collection or default value at the specified index
RootNode.Tables.ElementAtOrDefault(42)
![Page 86: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/86.jpg)
LINQ: Project collections
Select()
Creates a new collection from one collection
A list of table names:
RootNode.Tables.Select(t => t.Name)
A list of table and schema names:
RootNode.Tables.Select(t => new {t.Name, t.Schema.Name})
![Page 87: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/87.jpg)
LINQ: Project collections
SelectMany()
Creates a new collection from many collections and merges the collections
A list of all columns from all tables:
RootNode.Tables.SelectMany(t => t.Columns)
![Page 88: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/88.jpg)
How is LINQ used in Biml projects?
![Page 89: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/89.jpg)
Classes and Methods
![Page 90: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/90.jpg)
C# Classes and Methods
BimlScript and LINQ not enough?
Need to reuse C# code?
Create your own classes and methods!
![Page 91: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/91.jpg)
C# Classes and Methods: From this…
public static class HelperClass {
public static bool AnnotationTagExists(AstNode node, string tag) {
if (node.GetTag(tag) != "") {
return true;
} else {
return false;
}
}
}
![Page 92: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/92.jpg)
C# Classes and Methods: …to this
public static class HelperClass {
public static bool AnnotationTagExists(AstNode node, string tag) {
if (node.GetTag(tag) != "") {
return true;
}
return false;
}
}
![Page 93: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/93.jpg)
C# Classes and Methods: …to this
public static class HelperClass {
public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;
}
}
![Page 94: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/94.jpg)
C# Classes and Methods: …to this
public static class HelperClass {
public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "");
}
}
![Page 95: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/95.jpg)
Where do you put your C# code?
Inline code nuggets
Included Biml files with code nuggets
Reference code files
![Page 96: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/96.jpg)
C# Classes and Methods: Inline
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (HelperClass.AnnotationTagExists(table, "SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml><#+
public static class HelperClass {
public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;
}
}
#>
![Page 97: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/97.jpg)
C# Classes and Methods: Included Files
<#@ include file="HelperClass.biml" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (HelperClass.AnnotationTagExists(table, "SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>
<#+public static class HelperClass {public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}#>
![Page 98: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/98.jpg)
C# Classes and Methods: Code Files
<#@ code file="HelperClass.cs" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (HelperClass.AnnotationTagExists(table, "SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>public static class HelperClass {public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}
![Page 99: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/99.jpg)
Extension Methods
![Page 100: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/100.jpg)
Extension Methods
"Make it look like the method belongs to an object instead of a helper class"
![Page 101: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/101.jpg)
Extension Methods: From this…
<#@ code file="HelperClass.cs" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (HelperClass.AnnotationTagExists(table, "SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>public static class HelperClass {public static bool AnnotationTagExists(AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}
![Page 102: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/102.jpg)
Extension Methods: …to this
<#@ code file="HelperClass.cs" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (HelperClass.AnnotationTagExists(table, "SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>public static class HelperClass {public static bool AnnotationTagExists(this AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}
![Page 103: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/103.jpg)
Extension Methods: …to this
<#@ code file="HelperClass.cs" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables) { #>
<# if (table.AnnotationTagExists("SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>public static class HelperClass {public static bool AnnotationTagExists(this AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}
![Page 104: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/104.jpg)
Extension Methods: …to this :)
<#@ code file="HelperClass.cs" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# foreach (var table in RootNode.Tables.Where(t =>
t.AnnotationTagExists("SourceSchema")) { #>
...
<# } #>
<# } #>
</Biml>public static class HelperClass {public static bool AnnotationTagExists(this AstNode node, string tag) {
return (node.GetTag(tag) != "") ? true : false;}
}
![Page 105: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/105.jpg)
Get things done
Start small
Start simple
Start with ugly code
Keep going
Expand
Improve
Deliver often
![Page 106: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/106.jpg)
![Page 107: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/107.jpg)
@cathrinew
cathrinewilhelmsen.net
linkedin.com/in/cathrinewilhelmsen
slideshare.net/cathrinewilhelmsen
Biml resources and references:
cathrinewilhelmsen.net/biml
![Page 108: Level Up Your Biml: Best Practices and Coding Techniques (TUGA IT 2016)](https://reader034.vdocuments.site/reader034/viewer/2022042723/587542b91a28abb8208b5543/html5/thumbnails/108.jpg)
THANK YOU TO OUR SPONSORS