Certainly you want to reduce the number of round trips. That's a realistic requirement of any SOA. That means you probably have many use cases you want to code for:
interface IInvoice
{
Guid InvoiceId { get; }
string InvoiceNumber { get; }
string CustomerName { get; }
decimal TotalPrice { get; }
}
public IEnumerable<IInvoiceSummary> FindInvoices(IInvoiceCriteria criteria);
interface IInvoiceSummary : IInvoice
{
int NumberOfLineItems { get; }
}
public IDetailedInvoice GetInvoice(Guid invoiceId);
interface IDetailedInvoice : IInvoice
{
ReadOnlyCollection<IInvoiceLineItem> LineItems { get; }
}
Of course if you have different use cases, you may want to change those. Perhaps you want to get unpaid invoices for a customer, but in detailed format, so maybe you have another service point that returns that special case.
So, I recommend not building lazy loading into your SOA architecture. Since lazy loading hides the number of round trips to the database, and round trips are something the programmer should always be paying attention to because they're expensive, then you shouldn't hide them.