using System; using System.Linq; using System.Collections.Generic; using ServiceStack; using ServiceStack.Text; using ServiceStack.OrmLite; using ServiceStack.OrmLite.Sqlite; var dbFactory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider); var db = CreateArtistAndTrackTablesWithData(dbFactory.OpenDbConnection()); var q = db.From() .Join() //Uses implict reference convention .Where(x => x.Name == "Nirvana"); var implicitJoin = db.Select(q); $"Nirvana Tracks (implicit join): {implicitJoin.Dump()}".Print(); var explicitJoin = db.Select(db.From() .Join((track,artist) => track.ArtistId == artist.Id) .Where(x => x.Name == "Nirvana")); $"Nirvana Tracks (explicit join): {explicitJoin.Dump()}".Print(); var nirvanaWithRefs = db.LoadSingleById(explicitJoin[0].ArtistId); $"Nirvana with References: {nirvanaWithRefs.Dump()}".Print(); var oldestTracks = db.Select(db.From() .Where(x => Sql.In(x.Year, db.From().Select(y => Sql.Min(y.Year))))); $"Oldest Tracks: {oldestTracks.Dump()}".Print(); var oldestTrackIds = oldestTracks.Map(x => x.Id); var earliestArtistsWithRefs = db.LoadSelect(db.From() .Where(a => oldestTracks.Map(t => t.ArtistId).Contains(a.Id))); $"Earliest Artists: {earliestArtistsWithRefs.Dump()}".Print(); var oldestTracksAndArtistNames = db.Dictionary(db.From() .Join() .Where(x => oldestTrackIds.Contains(x.Id)) .Select((t,a) => new { t.Name, Artist = a.Name })); $"Oldest Track and Artist Names: {oldestTracksAndArtistNames.Dump()}".Print(); var oldestTrackAndArtists = db.SelectMulti(db.From() .Join() .Where(x => oldestTrackIds.Contains(x.Id))); foreach (var tuple in oldestTrackAndArtists) { Track track = tuple.Item1; Artist artist = tuple.Item2; $"Oldest Track + Artist: {new { track, artist }.Dump()}".Print(); }