Format of a row returned from an ECSQL SELECT query
When using Concurrent query a row format can be selected. By default ConcurrentQuery engine always render top level row as array of values and not object. But it also include meta data allowing array to be converted into two other formats. The format is controlled by flag QueryRowFormat which can have one of following values.
- UseECsqlPropertyNames: Each row is an object in which each non-null column value can be accessed by its name as defined in the ECSql. Null values are omitted.
- UseJsPropertyNames: Each row is an array of values accessed by an index corresponding to the property's position in the ECSql SELECT statement. Null values are included if they are followed by a non-null column, but trailing null values at the end of the array are omitted.
- UseECSqlPropertyIndexes: The default format if none is specified by the caller
There is tiny overhead when accessing row as UseECsqlPropertyNames
or UseJsPropertyNames
as it require convert array values into a object with property name and values. We recommend using array values as is allowing much better performance.
Note that
ECSqlStatement.getRow()
function does not take row format as parameter and always returnUseJsPropertyNames
. In future the parameter will be added but we recommend using concurrent query on both frontend and backend as it is more efficient in term of memory and performance.
Property names
If the ECSQL select clause item
- has a column alias, the alias, with the first character lowered, becomes the property name.
- has no alias and is no ECSQL system property, the ECSQL select clause item, with the first character lowered, becomes the property name.
- is an ECSQL system property (see also enum ECSqlSystemProperty):
System properties when UseJsPropertyNames
options is used
System property | JavaScript Type |
---|---|
ECInstanceId | id |
ECClassId | className |
SourceECInstanceId | sourceId |
SourceECClassId | sourceClassName |
TargetECInstanceId | targetId |
TargetECClassId | targetClassName |
Navigation property member | JavaScript Type |
---|---|
Id | id |
RelClassId | relClassName |
System properties when UseJsPropertyNames
options is used
Note: the property case will be same as specified in ECSQL
System property | JavaScript Type |
---|---|
ECInstanceId | ECInstanceId |
ECClassId | ECClassId |
SourceECInstanceId | SourceECInstanceId |
SourceECClassId | SourceECClassId |
TargetECInstanceId | TargetECInstanceId |
TargetECClassId | TargetECClassId |
Navigation property member | JavaScript Type |
---|---|
Id | Id |
RelClassId | RelECClassId |
Point property member | JavaScript Type |
---|---|
X | x |
Y | y |
Z | z |
Property value types
The resulting types of the returned property values are these:
ECSQL type | Extended Type | JavaScript Typ |
---|---|---|
Boolean | - | boolean |
Blob | - | Uint8Array |
Blob | BeGuid | GuidString |
ClassId system properties | - | fully qualified class name |
Double | - | number |
DateTime | - | ISO 8601 date time string |
Id system properties | - | Id64String |
Integer | - | number |
Int64 | - | number |
Int64 | Id | hexadecimal string |
Point2d | - | XAndY |
Point3d | - | XYAndZ |
String | - | string |
Navigation | n/a | NavigationValue |
Struct | n/a | JavaScript object with properties of the types in this table |
Array | n/a | array of the types in this table |
Examples
ECSQL | Row |
---|---|
SELECT ECInstanceId,ECClassId,Parent,LastMod,FederationGuid,UserLabel FROM bis.Element |
{id:"0x132", className:"generic.PhysicalObject", parent:{id:"0x444", relClassName:"bis.ElementOwnsChildElements"},lastMod:"2018-02-27T14:12:55.000Z",federationGuid:"274e25dc-8407-11e7-bb31-be2e44b06b34",userLabel:"My element"} |
SELECT s.ECInstanceId schemaId, c.ECInstanceId classId FROM meta.ECSchemaDef s JOIN meta.ECClassDef c ON s.ECInstanceId=c.Schema.Id |
{schemaId:"0x132", classId:"0x332"} |
SELECT count(*) FROM bis.Element |
{"count(*)": 31241} |
SELECT count(*) cnt FROM bis.Element |
{cnt: 31241} |
Last Updated: 30 November, 2023