No, it's not. The collection is just a list of pointers. If you have multiple VMs that fetch the same data from a repository, the query cache will make sure it's only fetched once from the datasource and subsequent fetches are satisfied from the cache.
If you look at TempHire for example all the VMs composed into the DetailVM fetch the StaffingResource. The first fetch will bring it into the cache and the remaining VMs will transparently get it from the cache, so there's no performance hit. Just make sure you don't have more than one VM try fetching the same thing before it is in the cache, otherwise they will all go to the DB.
You can see this handled in StaffingResourceDetailViewModel.LoadDataAsync. It waits for the staffing resource to be fetched into the cache before calling Start on all the nested VMs.
private async void LoadDataAsync(Guid staffingResourceId, EditMode editMode)
{
using (Busy.GetTicket())
{
_unitOfWork = null;
_staffingResourceId = staffingResourceId;
EditMode = editMode;
StaffingResource = await UnitOfWork.StaffingResources.WithIdAsync(staffingResourceId);
StaffingResourceSummary.Start(StaffingResource.Id, EditMode);
_sections.ForEach(s => s.Start(StaffingResource.Id, EditMode));
if (Items.Count == 0)
{
Items.AddRange(_sections.OrderBy(s => s.Index));
NotifyOfPropertyChange(() => Items);
ActivateItem(Items.First());
}
}
}