2013-10-12 2 views
5

mieux façon de le fairerequête de projection avancée

using (var db = new SmartContext()) 
{ 
    var MyQuery = from idr in db.ID_SB 
        join tk in db.Track_SB on idr.MB_Track_ID equals tk.MB_TrackID 
        join talr in db.Track_Album_Reln on tk.MB_TrackID equals talr.MB_Track_ID 
        join tal in db.Album_SB on talr.MB_AlbumID equals tal.MB_Release_ID 
        orderby idr.Last_played descending 
        select new 
        { 
         mb = tk.MB_TrackID, 
         Hash = idr.Hash, 
         Title = tk.Title, 
         Album = tal.Album_Name, 

         Times_Played = idr.Times_played, 
         Last_Played = idr.Last_played 

        }; 

    string artist = ""; 
    var list = new[] { new { Hash = "", Title = "", Album = "", Artist = "", Times_Played = "", Last_Played = ""}}.ToList(); 
    list.Clear(); 
    foreach (var q in MyQuery) 
    { 
     int i = 0; 
     var art = db.Track_Artist_Reln.Where(a => a.MB_Track_ID == q.mb); 
     foreach (var a in art) 
     { 
      var tart = db.Artist_SB.Where(ar => ar.MB_Artist_ID == a.MB_ArtistID).Select(ar => ar.Artist_Name); 
      foreach (var tar in tart) 
      { if (i != 0) { artist = artist + ", " + tar; } else { artist = tar; i++; } } 
     } 
     list.Add(new 
     { 
      Hash = q.Hash.ToString(), 
      Title = q.Title.ToString(), 
      Album = q.Album.ToString(), 
      Artist = artist.ToString(), 
      Times_Played = q.Times_Played.ToString(), 
      Last_Played = q.Last_Played.ToString(),    
      }); 
    } 


    ListView1.ItemsSource = list; 
} 

est-il une meilleure façon pour ce qu'il consomme beaucoup de temps

ce code sert à

dans ce que je veux pour récupérer

  • hachage
  • Titre
  • ALBUMNAME
  • Artiste (contenant tout l'artiste pour cette chanson dans artiste champ de ligne unique)
  • fois joué
  • Dernier joué

tout ce que je suis en mesure d'obtenir juste en se joindre à tout en dehors du nom de l'artiste

il y a beaucoup de relations possibles tables principales ID_SB, Track_SB, Album_SB, Artist_SB autres sont relation storin g les clés primaires des deux tables

+0

Une chose rapide pour l'améliorer, déplacer les requêtes db imbriquées dans les deux boucles foreach pour la requête principale en l'ayant retourné comme une collection dans votre première requête. Cela entraînera beaucoup moins de voyages à la DB. –

+0

Vous devriez également vous débarrasser des tables * _Reln, alors qu'EF prend directement en charge les relations plusieurs-à-plusieurs depuis de nombreuses années. –

Répondre

0

La boucle intérieure peut être remplacée par l'utilisation string.Join(…) et .SelectMany() pour aplatir la liste imbriquée (vraiment IEnumerable) en un seul:

var artist = string.Join(", ", 
         db.Track_Artist_Reln 
          .Where(a => a.MB_Track_ID == q.mb) 
          .SelectMany(a => db.Artist_SB 
               .Where(ar => ar.MB_Artist_ID == a.MB_ArtistID) 
               .Select(ar => ar.Artist_Name))); 

au lieu de convertir le dénombrable à une liste manuellement vous pouvez utiliser .ToList():

var list = MyQuery.Select(q => new{ 
     Hash = q.Hash.ToString(), 
     Title = q.Title.ToString(), 
     Album = q.Album.ToString(), 
     Artist = string.Join(", ", 
          db.Track_Artist_Reln 
           .Where(a => a.MB_Track_ID == q.mb) 
           .SelectMany(a => db.Artist_SB 
                .Where(ar => ar.MB_Artist_ID == a.MB_ArtistID) 
                .Select(ar => ar.Artist_Name))), 
     Times_Played = q.Times_Played.ToString(), 
     Last_Played = q.Last_Played.ToString(),    
     }.ToList();