Last active
November 10, 2020 13:33
-
-
Save gistlyn/d994f89709fd163b9a822a698ee35c69 to your computer and use it in GitHub Desktop.
SELECT SqlExpression with JOIN examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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