Hi Gary,
You could leverage the Web API or use a regular liquid Fetch XML statement. If you need perform create, update or delete actions then leverage the web API. If you are only doing read, it may be easier to just create a web template that uses some liquid fetch XML. Below is the documentation of the web api and an example tutroial from docs.
https://docs.microsoft.com/en-us/power-apps/maker/portals/read-operations
https://docs.microsoft.com/en-us/power-apps/maker/portals/webapi-tutorial
Below is an example I put together just using liquid fetch xml. I think this may suffice for your needs.
Web Template:
{% if user %}
Hello, {{ user.fullname }}!
{% endif %}
<p>This is an example of using fetchXml and Liquid to query data in CRM from the Portal:</p>
{% fetchxml my_query %}
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
<entity name="contact">
<attribute name="fullname" />
<attribute name="telephone1" />
<attribute name="contactid" />
<order attribute="fullname" descending="false" />
<filter type="or">
<condition attribute="fullname" operator="like" value="%Tom%" />
<condition attribute="fullname" operator="like" value="%Kevin%" />
<condition attribute="fullname" operator="like" value="%Meg%" />
</filter>
</entity>
</fetch>
{% endfetchxml %}
<p><b>The FetchXml used in the query is:</b> {{ my_query.xml | escape }}</p><br/>
<p><b>The total number of records returned is:</b>{{ my_query.results.record_count }}</p><br/>
<p><b>The property that indicates if there are more records than the maximum (50) returned is:</b> {{ my_query.results.more_records }}</p><br/>
<p><b>The paging cookie that you use to page through a list of records is:</b> {{ my_query.results.paging_cookie | escape }}</p>
<p><b>This is where you loop through the records returned and build your table or list or anything you would like to do with the collection of records returned</b></p>
<table>
<tr>
<th>Contact Id</th>
<th></th>
<th>Contact Name</th>
</tr>
{% for result in my_query.results.entities %}
<tr>
<td>{{ result.id | escape }}</td>
<td> </td>
<td>{{ result['fullname'] | escape }}</td>
<td> </td>
<td>{{ result['telephone1'] | escape }}</td>
</tr>
{% endfor %}
<table>
Then just link it to a Page Template, then to a web page and you’re done.
Here’s how it will look:

The total number of records returned is: The property that indicates if there are more records than the maximum (50) returned is: false The paging cookie that you use to page through a list of records is: