Skip to content

Instantly share code, notes, and snippets.

@gistlyn
Last active November 10, 2020 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save gistlyn/d994f89709fd163b9a822a698ee35c69 to your computer and use it in GitHub Desktop.
Save gistlyn/d994f89709fd163b9a822a698ee35c69 to your computer and use it in GitHub Desktop.
SELECT SqlExpression with JOIN examples
using System.Collections.Generic;
using System.Data;
using ServiceStack;
using ServiceStack.OrmLite;
using ServiceStack.DataAnnotations;
public class Artist
{
public int Id { get; set; }
public string Name { get; set; }
[Reference]
public List<Track> Tracks { get; set; }
public override string ToString() => Name;
}
public class Track
{
[AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public int ArtistId { get; set; }
public string Album { get; set; }
public int Year { get; set; }
public override string ToString() => Name;
}
var Artists = new [] {
new Artist {
Id = 1, Name = "Faith No More",
Tracks = new List<Track> {
new Track { Name = "Everythings Ruined", Album = "Angel Dust", Year = 1992 },
new Track { Name = "Ashes to Ashes", Album = "Album of the Year", Year = 1997 },
}
},
new Artist {
Id = 2, Name = "Live",
Tracks = new List<Track> {
new Track { Name = "Lightning Crashes", Album = "Throwing Copper", Year = 1994 },
new Track { Name = "Lakini's Juice", Album = "Secret Samadhi", Year = 1997 },
}
},
new Artist {
Id = 3, Name = "Nirvana",
Tracks = new List<Track> {
new Track { Name = "Smells Like Teen Spirit", Album = "Nevermind", Year = 1991 },
new Track { Name = "Heart-Shaped Box", Album = "In Utero", Year = 1993 },
}
},
new Artist {
Id = 4, Name = "Pearl Jam",
Tracks = new List<Track> {
new Track { Name = "Alive", Album = "Ten", Year = 1991 },
new Track { Name = "Daughter", Album = "Vs", Year = 1993 },
}
},
};
IDbConnection CreateArtistAndTrackTablesWithData(IDbConnection db)
{
db.DropAndCreateTable<Artist>();
db.DropAndCreateTable<Track>();
Artists.Each(x => db.Save(x, references:true));
return db;
}
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<Track>()
.Join<Artist>() //Uses implict reference convention
.Where<Artist>(x => x.Name == "Nirvana");
var implicitJoin = db.Select(q);
$"Nirvana Tracks (implicit join): {implicitJoin.Dump()}".Print();
var explicitJoin = db.Select(db.From<Track>()
.Join<Artist>((track,artist) => track.ArtistId == artist.Id)
.Where<Artist>(x => x.Name == "Nirvana"));
$"Nirvana Tracks (explicit join): {explicitJoin.Dump()}".Print();
var nirvanaWithRefs = db.LoadSingleById<Artist>(explicitJoin[0].ArtistId);
$"Nirvana with References: {nirvanaWithRefs.Dump()}".Print();
var oldestTracks = db.Select(db.From<Track>()
.Where(x => Sql.In(x.Year, db.From<Track>().Select(y => Sql.Min(y.Year)))));
$"Oldest Tracks: {oldestTracks.Dump()}".Print();
var oldestTrackIds = oldestTracks.Map(x => x.Id);
var earliestArtistsWithRefs = db.LoadSelect(db.From<Artist>()
.Where(a => oldestTracks.Map(t => t.ArtistId).Contains(a.Id)));
$"Earliest Artists: {earliestArtistsWithRefs.Dump()}".Print();
var oldestTracksAndArtistNames = db.Dictionary<string, string>(db.From<Track>()
.Join<Artist>()
.Where(x => oldestTrackIds.Contains(x.Id))
.Select<Track,Artist>((t,a) => new { t.Name, Artist = a.Name }));
$"Oldest Track and Artist Names: {oldestTracksAndArtistNames.Dump()}".Print();
var oldestTrackAndArtists = db.SelectMulti<Track,Artist>(db.From<Track>()
.Join<Artist>()
.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();
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Memory" version="4.5.4" targetFramework="net45" />
<package id="ServiceStack.Text" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Client" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Common" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Interfaces" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.OrmLite" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.OrmLite.Sqlite.Windows" version="5.10.0" targetFramework="net45" />
</packages>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment