2013-10-12 3 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, Album_SB, Artist_SB другие являются отношениями storin г первичные ключи обеих таблиц

+0

Один быстрой вещь, чтобы улучшить его, перемещать вложенные БД запросов в два Foreach петель для основного запроса, имея он вернулся в качестве собраний в первом запросе. Это приведет к тому, что у него будет меньше посещений в db. –

+0

Вы также должны избавиться от таблиц * _Reln, в то время как на нем EF напрямую поддерживает отношения «многие ко многим» уже много лет. –

ответ

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(); 
Смежные вопросы