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
。
請格式化您的代碼,以便輕鬆比較。使其不滾動並指出差異。更好的問題=更好的答案。 –
好吧,好多了!另一個問題:是否有像Media.MediaRefs(1-n)和Media.MediaType(n-1)這樣的導航屬性?你不必手動加入。 –
是的,有導航屬性 – maztt