2013-05-31 57 views
1

首先,我寫了這個查詢的LINQ to SQL查詢優化建議需要

var lst = (from mediaref in MediaRefs 
       join media in Medias 
       on mediaref.Int_MediaId equals media.Int_MediaId 
       join mediatype in MediaTypes 
       on media.Int_MediaTypeId equals mediatype.Int_MediaTypeId 
       where mediatype.Int_MediaTypeId_FK == 1 
        && mediaref.Bit_IsActive == true 
        && media.Int_OrganizationId == 2 
        && media.Int_PostStatusId != 3 
        && mediaref.Int_MediaRefId == mediaref.Media. 
       MediaRefs.FirstOrDefault(m => m.Int_MediaId == media.Int_MediaId 
       && m.Bit_IsActive == true && 
       (m.Nvcr_MediaTitle != null 
       && m.Nvcr_MediaTitle != "")).Int_MediaRefId 
       orderby media.Int_MediaId descending 

       select new MediaViewModel { 
        MediaId = media.Int_MediaId, 
        Mediatitle = mediaref.Nvcr_MediaTitle , 
        Mediapath = mediaref.Vcr_MediaPath, 
        Slug = mediaref.Vcr_Slug, 
        Active = mediaref.Bit_IsActive 
       }); 

則改爲該

var lst = (from mediaref in MediaRefs 
       join media in Medias 
       on mediaref.Int_MediaId equals media.Int_MediaId 
       join mediatype in MediaTypes on 
       media.Int_MediaTypeId equals mediatype.Int_MediaTypeId 
       where mediatype.Int_MediaTypeId_FK == 1 
        && mediaref.Bit_IsActive == true 
        && media.Int_OrganizationId == 2 
        && media.Int_PostStatusId != 3 
        && mediaref.Nvcr_MediaTitle != ""       
       group new {mediaref, Medias, MediaTypes} by new { 
        media.Int_MediaId,       
        mediaref.Vcr_MediaPath, 
        mediaref.Vcr_Slug, 
        mediaref.Bit_IsActive      
       } into g 
         orderby g.Key.Int_MediaId descending 

       select new MediaViewModel { 
        MediaId = Convert.ToInt64(g.Key.Int_MediaId), 
        Mediatitle = g.Min(p => p.mediaref.Nvcr_MediaTitle) == "" ? 
         g.Max(p => p.mediaref.Nvcr_MediaTitle) : 
         g.Min(p => p.mediaref.Nvcr_MediaTitle), 
        Mediapath = g.Key.Vcr_MediaPath, 
        Slug = g.Key.Vcr_Slug, 
        Active = g.Key.Bit_IsActive 
       }); 

可以這樣查詢寫在某種程度上更有效的方式?問題是我想加入media,並且第一行mediaref總是會爲每個media帶來3行。有什麼建議麼。在第一個查詢中,我使用了FirstOrDefault,在第二個查詢中我使用了group by

+3

請格式化您的代碼,以便輕鬆比較。使其不滾動並指出差異。更好的問題=更好的答案。 –

+0

好吧,好多了!另一個問題:是否有像Media.MediaRefs(1-n)和Media.MediaType(n-1)這樣的導航屬性?你不必手動加入。 –

+0

是的,有導航屬性 – maztt

回答

0

我想我會去你的查詢的第一個版本,但有一些修改。像這樣的位(我不會寫下來的一大堆):

from m in Medias 
where m.MediaType.Int_MediaTypeId_FK == 1 
let firstmediaref = m.MediaRefs 
        .FirstOrDefault(ref => ref.Bit_IsActive 
          && !string.IsNullOrEmpty(ref.Nvcr_MediaTitle)) 

,建立自己的MediaViewModelmfirstmediaref