Whilst SqlExpression doesn’t include Typed APIs to allow multiple self joins with custom aliases, you can use CustomJoin to specify multiple self-joins instead.
We use an empty EOT column to specify the table delimiter, so you can still get SelectMulti like functionality by selecting it into a Tuple<T1,T2> with:
var q = db.From<Sale>()
.CustomJoin("LEFT JOIN Contact seller on (Sale.SellerId = seller.Id)")
.CustomJoin("LEFT JOIN Contact buyer on (Sale.BuyerId = buyer.Id)"
.Where(x => x.TenantId == tenantId);
.Select("seller.*, 0 EOT, buyer.*");
var saleContacts = db.Select<Tuple<Contact,Contact>>(q);
saleContacts.PrintDump();
For anyone else who stumbles across this, an almost-completely-strongly-typed solution is possible, using a pattern like what I apply in the sample below, by using the TableAlias feature.