2013-10-12 10 views
5

इसउन्नत प्रक्षेपण क्वेरी

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; 
} 

करने का कोई बेहतर तरीका है कि उस समय के इस बहुत कुछ के रूप में यह खपत है के लिए किसी भी बेहतर तरीका है

इस कोड को इस मैं चाहता हूँ में उद्देश्य

में कार्य करता है पुनः प्राप्त करने के

  • हैश
  • शीर्षक
  • ALBUMNAME
  • कलाकार (एकल पंक्ति क्षेत्र कलाकार में है कि गीत के लिए सभी कलाकार युक्त)
  • टाइम्स खेला बस सब कुछ के शामिल होने हो रही द्वारा
  • अंतिम बार खेला

सब कुछ मैं प्राप्त करने में सक्षम हूँ कलाकार नाम

संबंधों के लिए कई लोग हैं मुख्य तालिका ID_SB, Track_SB, एल्बम_SB, Artist_SB अन्य रिश्तेदार हैं जी दोनों तालिकाओं के प्राथमिक कुंजी

+0

एक त्वरित बात इसे सुधारने के लिए, यह आपकी पहली क्वेरी में एक संग्रह के रूप में वापस होने से मुख्य क्वेरी करने के लिए दो foreach छोरों में नेस्टेड डाटाबेस प्रश्नों चलते हैं। इससे डीबी के लिए बहुत कम यात्राएं हो सकती हैं। –

+0

आपको * _Reln तालिकाओं से भी छुटकारा पाना चाहिए, जबकि ईएफ ने कई सालों से कई से कई रिश्तों का समर्थन किया है। –

उत्तर

0

भीतरी पाश में string.Join(…) और .SelectMany() का उपयोग कर नेस्टेड सूची (वास्तव में IEnumerable) समतल साथ बदला जा सकता: इसके बजाय स्वयं एक सूची के लिए गणनीय परिवर्तित करने की

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))); 

आप .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(); 
संबंधित मुद्दे