Merge join transformation
This article contains example code that shows the usage of the MergeJoin component.
On this page
Always join
This example shows how a MergeJoin can be used to always join records from both inputs.
public class MyLeftRow
{
public string FirstName { get; set; }
}
public class MyRightRow
{
public string LastName { get; set; }
}
public class MyOutputRow
{
public string FullName { get; set; }
}
public void AlwaysJoinExample() {
var source1 = new MemorySource<MyLeftRow>();
source1.DataAsList.Add(new MyLeftRow() { FirstName = "Elvis" });
source1.DataAsList.Add(new MyLeftRow() { FirstName = "Marilyn" });
var source2 = new MemorySource<MyRightRow>();
source2.DataAsList.Add(new MyRightRow() { LastName = "Presley" });
source2.DataAsList.Add(new MyRightRow() { LastName = "Monroe" });
var join = new MergeJoin<MyLeftRow, MyRightRow, MyOutputRow>(
(leftRow, rightRow) => {
return new MyOutputRow() {
FullName = leftRow.FirstName + " " + rightRow.LastName
};
});
var dest = new MemoryDestination<MyOutputRow>();
source1.LinkTo(join.LeftInput);
source2.LinkTo(join.RightInput);
join.LinkTo(dest);
Network.Execute(source1, source2);
foreach (var row in dest.Data)
Console.WriteLine(row.FullName);
//Outputs
//Elvis Presley
//Marilyn Monroe
}
Join on condition
This example shows how the MergeJoin can be used to only join records if a particular condition is met. Otherwise, on of the input rows is joined with an empty (null) record.
public class MyRow
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
}
public void JoinWithComparisonExample() {
var source1 = new MemorySource<MyRow>();
source1.DataAsList.Add(new MyRow() { Id = 1, FirstName = "Elvis" });
source1.DataAsList.Add(new MyRow() { Id = 2, FirstName = "Psy" });
source1.DataAsList.Add(new MyRow() { Id = 3, FirstName = "Marilyn" });
var source2 = new MemorySource<MyRow>();
source2.DataAsList.Add(new MyRow() { Id = 1, LastName = "Presley" });
source2.DataAsList.Add(new MyRow() { Id = 3, LastName = "Monroe" });
var join = new MergeJoin<MyRow>(
(leftRow, rightRow) => {
if (rightRow == null)
leftRow.FullName = leftRow.FirstName + " " + "Unknown";
else
leftRow.FullName = leftRow.FirstName + " " + rightRow.LastName;
return leftRow;
});
join.ComparisonFunc = (inputRow1, inputRow2) => {
if (inputRow1.Id == inputRow2.Id)
return 0;
else if (inputRow1.Id < inputRow2.Id)
return -1;
else
return 1;
};
var dest = new MemoryDestination<MyRow>();
source1.LinkTo(join.LeftInput);
source2.LinkTo(join.RightInput);
join.LinkTo(dest);
Network.Execute(source1, source2);
foreach (var row in dest.Data)
Console.WriteLine(row.FullName);
//Outputs
//Elvis Presley
//Psy Unknown
//Marilyn Monroe
}