ArcGIS Pro 3.4 API Reference Guide
ArcGIS.Core.Data Namespace / QueryDef Class / Tables Property
Example Version

Tables Property (QueryDef)
Gets or sets a comma (,) delimited string of tables for use in the query.
Syntax
public string Tables {get; set;}
Remarks
The string may contain the name of a single table (querying from one single table in the geodatabase) or a list of table names when used in a join (querying from more than one tables in the geodatabase). For example, to perform an inner join against two tables: QueryDef queryDef = new QueryDef() { Tables = "Parcels INNER JOIN Owners ON PROPERTY_I = PROPERTY_ID", PostfixClause = "ORDER BY OWNER_NAME" };
Example
QueryDef queryDef = new QueryDef()
{
  Tables        = "Parcels INNER JOIN Owners ON PROPERTY_I = PROPERTY_ID", 
  PostfixClause = "ORDER BY OWNER_NAME"    
};
Evaluating a QueryDef on a single table
public async Task SimpleQueryDef()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
        {
            QueryDef adaCompilantParksQueryDef = new QueryDef
            {
                Tables = "Park",
                WhereClause = "ADACOMPLY = 'Yes'",
            };

            using (RowCursor rowCursor = geodatabase.Evaluate(adaCompilantParksQueryDef, false))
            {
                while (rowCursor.MoveNext())
                {
                    using (Row row = rowCursor.Current)
                    {
                        Feature feature = row as Feature;
                        Geometry shape = feature.GetShape();

                        String type = Convert.ToString(row["ADACOMPLY"]); // will be "Yes" for each row.

                        try
                        {
                            Table table = row.GetTable(); // Will always throw exception.
                        }
                        catch (NotSupportedException exception)
                        {
                            // Handle not supported exception.
                        }
                    }
                }
            }
        }
    });
}
Evaluating a QueryDef on a Join using WHERE Clause
public async Task JoiningWithWhereQueryDef()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
        {
            QueryDef municipalEmergencyFacilitiesQueryDef = new QueryDef
            {
                SubFields = "EmergencyFacility.OBJECTID, EmergencyFacility.Shape, EmergencyFacility.FACILITYID, FacilitySite.FACILITYID, FacilitySite.FCODE",
                Tables = "EmergencyFacility, FacilitySite",
                WhereClause = "EmergencyFacility.FACNAME = FacilitySite.NAME AND EmergencyFacility.JURISDICT = 'Municipal'",
            };

            using (RowCursor rowCursor = geodatabase.Evaluate(municipalEmergencyFacilitiesQueryDef, false))
            {
                while (rowCursor.MoveNext())
                {
                    using (Row row = rowCursor.Current)
                    {
                        Feature feature = row as Feature;
                        Geometry shape = feature.GetShape();

                        long objectID = Convert.ToInt64(row["EmergencyFacility.OBJECTID"]);
                        String featureCode = Convert.ToString(row["FacilitySite.FCODE"]);

                        IReadOnlyList<Field> fields = feature.GetFields(); //Contains one ArcGIS.Core.Data.Field objects for every subfield
                    }
                }
            }
        }
    });
}
Evaluating a QueryDef on a OUTER JOIN
public async Task EvaluatingQueryDefWithOuterJoin()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
        {
            QueryDef queryDefWithLeftOuterJoin = new QueryDef
            {
                Tables = "CommunityAddress LEFT OUTER JOIN MunicipalBoundary on CommunityAddress.Municipality = MunicipalBoundary.Name",
                SubFields = "CommunityAddress.OBJECTID, CommunityAddress.Shape, CommunityAddress.SITEADDID, CommunityAddress.ADDRNUM, CommunityAddress.FULLNAME, CommunityAddress.FULLADDR, CommunityAddress.MUNICIPALITY, MunicipalBoundary.Name, MunicipalBoundary.MUNITYP, MunicipalBoundary.LOCALFIPS",
            };

            using (RowCursor rowCursor = geodatabase.Evaluate(queryDefWithLeftOuterJoin, false))
            {
                while (rowCursor.MoveNext())
                {
                    using (Row row = rowCursor.Current)
                    {
                        Feature feature = row as Feature;
                        Geometry shape = feature.GetShape();

                        int siteAddressId = Convert.ToInt32(row["CommunityAddress.SITEADDID"]);
                        String stateName = Convert.ToString(row["MunicipalBoundary.name"]);
                    }
                }
            }
        }
    });
}
Evaluating a QueryDef on a INNER join
public async Task EvaluatingQueryDefWithInnerJoin()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
        {
            QueryDef queryDef = new QueryDef()
            {
                Tables = "People INNER JOIN States ON People.FK_STATE_ID = States.OBJECTID",
                SubFields = "People.OBJECTID, People.First_Name, People.Last_Name, People.City, States.State_Name"
            };

            using (RowCursor cursor = geodatabase.Evaluate(queryDef))
            {
                while (cursor.MoveNext())
                {
                    using (Row row = cursor.Current)
                    {
                        // Handle row
                    }
                }
            }
        }
    });
}
Evaluating a QueryDef on a nested - INNER and OUTER join
public async Task EvaluatingQueryDefWithNestedJoin()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        using (Geodatabase geodatabase = new Geodatabase(
    new DatabaseConnectionFile(new Uri("path\\to\\sde\\file"))))
        {
            QueryDef queryDef = new QueryDef()
            {
                Tables = "((People INNER JOIN States ON People.FK_STATE_ID = States.OBJECTID) LEFT OUTER JOIN Homes ON People.OBJECTID = Homes.FK_People_ID)",
                SubFields = "People.OBJECTID, People.First_Name, People.Last_Name, States.State_Name, Homes.Address"
            };

            using (RowCursor cursor = geodatabase.Evaluate(queryDef, false))
            {
                while (cursor.MoveNext())
                {
                    using (Row row = cursor.Current)
                    {
                        // Handle row
                    }
                }
            }
        }
    });
}
Creating a QueryTable using a query which joins two versioned tables in a geodatabase
public async Task QueryTableJoinWithVersionedData()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
    {
        QueryDef queryDef = new QueryDef
        {
            Tables = "CommunityAddress JOIN MunicipalBoundary on CommunityAddress.Municipality = MunicipalBoundary.Name",
            SubFields = "CommunityAddress.OBJECTID, CommunityAddress.Shape, CommunityAddress.SITEADDID, CommunityAddress.ADDRNUM, CommunityAddress.FULLNAME, CommunityAddress.FULLADDR, CommunityAddress.MUNICIPALITY, MunicipalBoundary.Name, MunicipalBoundary.MUNITYP, MunicipalBoundary.LOCALFIPS",
        };

        using (Geodatabase testVersion1Geodatabase = new Geodatabase(new DatabaseConnectionProperties(EnterpriseDatabaseType.Oracle)
        {
            AuthenticationMode = AuthenticationMode.DBMS,
            Instance = "instance",
            User = "user",
            Password = "password",
            Database = "database",
            Version = "user.testVersion1"
        }))
        {
            QueryTableDescription queryTableDescription = new QueryTableDescription(queryDef)
            {
                Name = "CommunityAddrJounMunicipalBoundr",
                PrimaryKeys = testVersion1Geodatabase.GetSQLSyntax().QualifyColumnName("CommunityAddress", "OBJECTID")
            };

            // Will be based on testVersion1.
            using (Table queryTable = testVersion1Geodatabase.OpenQueryTable(queryTableDescription))
            {
                // Use queryTable.
            }
        }

        using (Geodatabase testVersion2Geodatabase = new Geodatabase(new DatabaseConnectionProperties(EnterpriseDatabaseType.Oracle)
        {
            AuthenticationMode = AuthenticationMode.DBMS,
            Instance = "instance",
            User = "user",
            Password = "password",
            Database = "database",
            Version = "user.testVersion2"
        }))
        {
            QueryTableDescription queryTableDescription = new QueryTableDescription(queryDef)
            {
                Name = "CommunityAddrJounMunicipalBoundr",
                PrimaryKeys = testVersion2Geodatabase.GetSQLSyntax().QualifyColumnName("CommunityAddress", "OBJECTID")
            };

            // Will be based on testVersion2.
            using (Table queryTable = testVersion2Geodatabase.OpenQueryTable(queryTableDescription))
            {
                // Use queryTable.
            }
        }
    });
}
Requirements

Target Platforms: Windows 11, Windows 10

ArcGIS Pro version: 3 or higher.
See Also