I think you are confusing the use of primary keys and constraints (business domain model) with the use of indexes (performance).
A Foreign Key can influence an optimiser, and it is common to create an index on Foreign keys.
In the SQL Server world, a Primary key is often confused with a Clustered index, because more often than than a surrogate key (think auto-increment identity column) is choosen as the Primary Key and Clustered Index.
This article may be of interest: DataSet and DataTable in ADO.NET 2.0.
In response to your comment:
Use a DataView for Repetitive Non-Primary Key Searches If you
need to repetitively search by using
non-primary key data, create a
DataView that has a sort order. This
creates an index that can be used to
perform the search. This is best
suited to repetitive searches because
there is some cost to creating the
index.
The DataView object exposes the Find
and FindRows methods so that you can
query the data in the underlying
DataTable. If you are only performing
a single query, the processing that is
required to create the index reduces
the performance that is gained by
using the index.
When you create a DataView object, use
the DataView constructor that takes
the Sort, RowFilter, and
RowStateFilter values as constructor
arguments along with the underlying
DataTable. Using the DataView
constructor ensures that the index is
built once. If you create an empty
DataView and set the Sort, RowFilter,
or RowStateFilter properties
afterwards, the index is built at
least two times.