public static async Task <List <Album> > GetAlbumsAsync(string value) { var opr = SQLOperator.Current(); // get single song // sqlite escaping value = SQLOperator.SQLEscaping(value); if (value.IsNullorEmpty()) { // anonymous artists, get their songs var songs = await opr.GetWithQueryAsync <SONG>("ALBUMARTISTS", value); var albumGrouping = from song in songs group song by song.Album; return(albumGrouping.ToList().ConvertAll(a => new Album(a))); } // get aritst-associated albums var albums = await opr.GetWithQueryAsync <ALBUM>("ALBUMARTISTS", value); var res = albums.ConvertAll(a => new Album(a)); var otherSongs = await opr.GetWithQueryAsync <SONG>($"SELECT * FROM SONG WHERE PERFORMERS='{value}' OR ALBUMARTISTS='{value}'"); // remove duplicated (we suppose that artist's all song is just 1000+, this way can find all song and don't take long time) otherSongs.RemoveAll(x => !albums.Where(b => b.Name == x.Album).IsNullorEmpty()); var otherGrouping = from song in otherSongs group song by song.Album; // otherSongs has item if (!otherGrouping.IsNullorEmpty()) { res.AddRange(otherGrouping.ToList().ConvertAll(a => new Album(a))); } return(res); }
public static async Task <List <GenericMusicItem> > Search(string text) { var opr = SQLOperator.Current(); text = SQLOperator.SQLEscaping(text); var songs = await opr.SearchAsync <SONG>(text, "TITLE", "PERFORMERS"); var album = await opr.SearchAsync <ALBUM>(text, "NAME", "AlbumArtists"); var l = new List <GenericMusicItem>(album.ConvertAll(x => new GenericMusicItem(x))); l.AddRange(songs.ConvertAll(x => new GenericMusicItem(x))); return(l); }