Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
What is this page about?
This page explains how to work with table-row data bands in LINQ templates.
A table-row data band is a data band which body occupies single or multiple rows of a single document table. The body of such a band starts at the beginning of the first occupied row and ends at the end of the last occupied row as follows.
| <<foreach ...>> ... | ... | ... |
| ... | ... | ... |
| ... | ... | ... <</foreach>> |
The following examples in this section are given using ds, a DataSet instance containing DataTable and DataRelation objects according to the following data model.

The most common use case of a table-row data band is the building of a document table that represents a list of items. You can use a template like the following one to achieve this.
| Client | Manager | Contract Price |
| <<foreach [c in ds.Contracts]>><<[c.Clients.Name]>> | <<[c.Managers.Name]>> | <<[c.Price]>><</foreach>> |
| Total: | <<[ds.Contracts.Sum(c => c.Price)]>> | |
In this case, the engine produces a report as follows.
| Client | Manager | Contract Price |
|---|---|---|
| A Company | John Smith | 1200000 |
| B Ltd. | John Smith | 750000 |
| C & D | John Smith | 350000 |
| E Corp. | Tony Anderson | 650000 |
| F & Partners | Tony Anderson | 550000 |
| G & Co. | July James | 350000 |
| H Group | July James | 250000 |
| I & Sons | July James | 100000 |
| J Ent. | July James | 100000 |
| Total: | 4300000 |
To populate a document table with a master-detail data, you can use nested table-row data bands like in the following template.
| Manager/Client | Contract Price |
| <<foreach [m in ds.Managers]>><<[m.Name]>> | <<[m.Contracts.Sum(c => c.Price)]>> |
| <<foreach [c in m.Contracts]>> <<[c.Clients.Name]>> | <<[c.Price]>><</foreach>><</foreach>> |
| Total: | <<[ds.Contracts.Sum(c => c.Price)]>> |
In this case, the engine produces a report as follows.
| Manager/Client | Contract Price |
|---|---|
| John Smith | 2300000 |
| A Company | 1200000 |
| B Ltd. | 750000 |
| C & D | 350000 |
| Tony Anderson | 1200000 |
| E Corp. | 650000 |
| F & Partners | 550000 |
| July James | 800000 |
| G & Co. | 350000 |
| H Group | 250000 |
| I & Sons | 100000 |
| J Ent. | 100000 |
| Total: | 4300000 |
You can normally use common data bands nested to table-row data bands as well like in the following template.
| Manager | Client |
| <<foreach [m in ds.Managers]>><<[m.Name]>> | <<foreach [c in m.Contracts]>><<[c.Clients.Name]>><</foreach>><</foreach>> |
In this case, the engine produces a report as follows.
| Manager | Client |
| John Smith | A Company B Ltd. C & D |
| Tony Anderson | E Corp. F & Partners |
| July James | G & Co. H GroupI & Sons J Ent. |
Note – Table-column data bands can also be nested to table-row data bands (see “Working with Cross (Pivot) Tables” for details), but not conversely: Nesting of table-row data bands into table-column data bands is forbidden.
A special case is a data band inside a single-column table row. In such a case, if you put opening and closing foreach tags in the same cell, the engine treats a data band formed by these tags as a common one rather than a table-row one by default. The following template illustrates such a scenario.
| Manager |
| <<foreach [m in ds.Managers]>><<[m.Name]>> <</foreach>> |
In this case, the engine produces a report as follows.
| Managers |
|---|
| John Smith Tony Anderson July James |
However, if needed, you can override this behavior making the engine to treat such a data band as a table-row one by specifying a greedy switch like in the following template.
| Manager |
| <<foreach [m in ds.Managers]>><<[m.Name]>><</foreach -greedy>> |
In this case, the engine produces a report as follows.
| Managers |
|---|
| John Smith |
| Tony Anderson |
| July James |
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.