linq to sql查询优化建议需要

时间:2013-05-31 11:30:11

标签: linq 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

1 个答案:

答案 0 :(得分: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))

并使用MediaViewModelm构建您的firstmediaref